追求卓越,成功就会在不经意间追上你
全部博文(112)
分类: LINUX
2011-07-31 08:17:35
ext2/ext3文件系统的优化
文件系统存储原理:
如图示,/dev/sda2被很多block所填充;而block的大小是固定的,如图上的1K;这个block就是文件在磁盘上存储的最小单位。当某个文件不超过1K时,OS会为它分配一个block;当文件大于1K时,OS会连续分配相应大小的block给该文件。
一、根据块大小及文件大小优化
当然,这个block的大小是可调的,不过默认情况下,linux只支持三种block大小,分别为:1024/2048/4096byte;如果你而要更大的block就必须去修改你的文件系统及相应的内核模块。
如果系统中存放的文件都不大,那么相应的block就可以设小一点;如果系统中存放的文件较大,那么相应的block就应该弄大一点。
想一想,如果block很小而文件很大,那么一个大的文件就会被分成很多小块;这样在读写文件的时候就会产生很多额外的开销。反之,亦然!
这样,我们就需要针对文件的大小对block进行相应的调整,这就所谓的文件系统调优!
那么,怎样指定block的大小呢?就是在用mkfs对磁盘进行格式化的时候!命令如下:
mkfs.ext3 -b 1024 /dev/sdb2
这样,我们就在格式化的时候为/dev/sdb2指定了相应block的大小--1024byte
下面开始我们的实验:
两个linux分区,一个分区的block大小为1024,另一个block的大小为4096;看看在它们上面存储相同的文件会有什么不同!
GO----->
[root@novice ~]# fdisk -l /dev/sdb
[root@novice ~]# mkfs.ext3 -b 1024 /dev/sdb5
[root@novice ~]# mkfs.ext3 -b 4096 /dev/sdb3
现在,我们来挂载刚刚格式化好的两个分区:
[root@novice /]# mount /dev/sdb3 /mnt/sdb3
[root@novice /]# mount /dev/sdb5 /mnt/sdb5
[root@novice /]# ls -l /mnt/sdb[35]
/mnt/sdb3:
total 16
drwx------ 2 root root 16384 Jul 17 16:26 lost+found
/mnt/sdb5:
total 12
drwx------ 2 root root 12288 Jul 17 16:23 lost+found
向刚挂载的两个分区写入相同的文件:
[root@novice /]# mkdir /mnt/sdb3/test
[root@novice /]# mkdir /mnt/sdb5/test
[root@novice /]# echo "Hi">/mnt/sdb3/test/test.txt
[root@novice /]# echo "Hi">/mnt/sdb5/test/test.txt
查看两个分区内相同内容文件的大小:
[root@novice /]# ls -lh /mnt/sdb[35]/test/test.txt
-rw-r--r-- 1 root root 3 Jul 17 16:40 /mnt/sdb3/test/test.txt
-rw-r--r-- 1 root root 3 Jul 17 16:40 /mnt/sdb5/test/test.txt
[root@novice /]# ls -lh /mnt/sdb[35]/test
/mnt/sdb3/test:
total 4.0K
-rw-r--r-- 1 root root 3 Jul 17 16:40 test.txt
/mnt/sdb5/test:
total 1.0K
-rw-r--r-- 1 root root 3 Jul 17 16:40 test.txt
#虽然都是三个字节,但占用的磁盘空间明显不一样!这是为什么呢?还记得我们在格式化分区的时候指定给每个分区的block的大小吗?!是的!就是那个指定大小的block在作怪啦!
再来看一下:
[root@novice /]# du -sh /mnt/sdb[35]/test
8.0K /mnt/sdb3/test
2.0K /mnt/sdb5/test
#为什么会是8K和2K呢?因为目录也要占磁盘空间的啦!
#由上面的例子显然可得:当文件较小时,分配较大的block会浪费很大的磁盘空间!
二、根据节点及块数目优化
读写的数据都是存储在block里的,在读写的时候要根据block的编号来寻址;编号可以如上图所示。如,File1需要两个block,就分配两个节点给它,并在索引区(上图左边的那上部分,里面记录了文件的相关信息,如位置,节点等等)内做好相应的记录。这样,在读写的时候会寻址两次。
但是,如果我们把两个block做成一个节点呢?如下图:
如上图,File1此时在索引区内的节点编号为1,它包含了两个block。这样在读写的时候只会寻址一次;相比之下,读写性能是不是有所提高呢!
可以使用如下命令指定磁盘分区里每个节点所包含的block数目:
mkfs.ext3 -b 4096 -i 8192 /dev/sdb2
这样,/dev/sdb2里的每个节点就包含了两个block.
上面命令中-i参数与-b参数后接数字的商就是一个节点包含的block数目。
三、文件系统调整工具tune2fs
tune2fs:
-l
-c
-i
-m
-j 将ext2文件系统转换为ext3文件系统(不过,现在ext2应该很少用了,呵呵)
下面,分别看看这些选项的应用:
-l 选项
[root@novice /]# tune2fs -l /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Filesystem volume
name:
Last mounted on:
Filesystem UUID: 6e4bad5e-a423-481a-bccf-cbf6c13fceef
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Filesystem flags: signed_directory_hash
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 12824
Block count: 51200
Reserved block count: 2560
Free blocks: 44649
Free inodes: 12811
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 199
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 1832
Inode blocks per group: 229
Filesystem created: Sun Jul 17 11:37:29 2011
Last mount time: Sun Jul 17 16:20:30 2011
Last write time: Sun Jul 17 16:20:30 2011
Mount count: 2
Maximum mount count: 34
Last checked: Sun Jul 17 11:37:29 2011
Check interval: 15552000 (6 months)
Next check after: Fri Jan 13 11:37:29 2012
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 0fbff785-d343-45b2-9685-ca4cc45bc604
Journal backup: inode blocks
#怎么样,信息量?嘿嘿.....不过你可以用正则表达式过滤出你想要的东东
-c选项:
通过-l选项,我们看到
Mount count: 2
Maximum mount count: 34
说明/dev/sdb1已经被挂载了两次,当达到最大挂载次数34时,将进行强制自检(只在重启或开机的时候)。接下来,我们用-c参数来更改强制自检的挂载次数:
[root@novice /]# tune2fs -c 3 /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 3
[root@novice /]# tune2fs -l /dev/sdb1 | grep -i "mount count"
Mount count: 2
Maximum mount count: 3
#很显然,不解释哈!
#如果你不想强制自检的话,可以将强制自检的挂载次数设为负数,那个挂载次数怎么也不会为负的吧!
[root@novice /]# tune2fs -c -1 /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
[root@novice /]# tune2fs -l /dev/sdb1 | grep -i "mount count"
Mount count: 2
Maximum mount count: -1
#这样/dev/sdb1永远不会进行强制自检啦,哈哈哈!
-i选项:
通过前面的-l选项,看到
Last checked: Sun Jul 17 11:37:29 2011
Check interval: 15552000 (6 months)
Next check after: Fri Jan 13 11:37:29 2012
强制自检的间隔时间为6个月。
接下来,我们用-i参数来更改强制自检的挂载次数:
[root@novice /]# tune2fs -l /dev/sdb1 | grep -i "check"
Last checked: Sun Jul 17 11:37:29 2011
Check interval: 86400 (1 day)
Next check after: Mon Jul 18 11:37:29 2011
#如果不相自检,为设置为0
[root@novice /]# tune2fs -l /dev/sdb1 | grep -i "check"
Last checked: Sun Jul 17 11:37:29 2011
Check interval:
0 (
#so easy 啦,嘿嘿
-m选项: 保留块的百分比
通过前面的-l选项,我们再次看到
Reserved block count: 2560
保留块为2560个。默认时,这个保留块为分区大小的5%;只有root用户才能使用。我们可以用-m参数来调整,使释放出一定量的磁盘空间。
[root@novice /]# tune2fs -m 1 /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 1% (512 blocks)
[root@novice /]# tune2fs -l /dev/sdb1 | grep -i "reserved"
Reserved block count: 512
Reserved GDT blocks: 199
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
#保留块数量从2560变成了512啦!
好啦,今天先现到这里,嘿嘿
写得很心虚,热烈欢迎各位批评指正!