Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708411
  • 博文数量: 112
  • 博客积分: 3889
  • 博客等级: 少校
  • 技术积分: 1448
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-19 16:35
个人简介

追求卓越,成功就会在不经意间追上你

文章分类

全部博文(112)

文章存档

2015年(1)

2014年(2)

2013年(1)

2012年(16)

2011年(86)

2010年(6)

分类: 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

#为什么会是8K2K呢?因为目录也要占磁盘空间的啦!

#由上面的例子显然可得:当文件较小时,分配较大的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啦!

好啦,今天先现到这里,嘿嘿

写得很心虚,热烈欢迎各位批评指正!

阅读(3850) | 评论(0) | 转发(0) |
0

上一篇:vim用户手册

下一篇:Fedora 14 -> Fedora 15

给主人留下些什么吧!~~