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 设置强制自检的挂载次数即挂载count次后强制自检
-i 设置强制自检的间隔时间即间隔n
day后强制自检
-m 保留块的百分比,percentage为整数
-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啦!
好啦,今天先现到这里,嘿嘿
写得很心虚,热烈欢迎各位批评指正!