ext3文件系统调优
一、 VFS
l 文件系统也和I/O有关,因为当一个数据被写到磁盘上去的时候,这时候需要经过文件系统的调度,然后才写入到磁盘当中。
l VFS(虚拟的文件系统):对于应用程序来说,并不关心底层的文件系统的格式。(如ftp服务器,写入磁盘并不用考虑是ext3,ext2的文件系统),应用程序和文件系统之间存在着VFS的虚拟文件系统。
l VFS是一个内核软件层,为多种实际文件系统提供统一的接口。底层的文件系统(ext2,ext3,nfs,smb)等通过加载特定的模块,来使得应用程序程序,而这中间的就要通过:libC ,system call,VFS等机制来实现。
l VFS结构图
二、 Ext3
1. ext3的结构图
2. Superblock
每一个硬盘都有个分区表,这个分区表在MBR中(记录了起始柱面,还有文件的类型),其中的分区表指向的就是每个分区的superblock。每个分区的第一个block就是superblock, 记录了这个分区的信息:文件格式,大小,已经用了多少,卷标等等,这些信息就是记录在superblock,可以用tune2fs进行调整。
[root@localhost ~]# dumpe2fs /dev/sda1 #dumpe2fs工具可查看分区的详细信息
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /boot1
Last mounted on: <not available>
Filesystem UUID: 6bb0b3fa-1039-4606-b646-30abbd4b9406
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 64256
Block count: 257008
Reserved block count: 12850
Free blocks: 229845
Free inodes: 64216
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2008
Inode blocks per group: 251
Filesystem created: Fri May 6 17:10:14 2011
Last mount time: Wed Jul 13 12:32:43 2011
Last write time: Wed Jul 13 12:32:43 2011
Mount count: 11
Maximum mount count: -1
Last checked: Fri May 6 17:10:14 2011
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Default directory hash: tea
Directory Hash Seed: 5209fe71-76f4-4766-a981-dd66b2b8010a
Journal backup: inode blocks
Journal size: 4114k
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-511 (+260)
0 free blocks, 1989 free inodes, 2 directories
Free blocks:
Free inodes: 20-2008
Group 1: (Blocks 8193-16384)
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)
Inode table at 8453-8703 (+260)
3738 free blocks, 1991 free inodes, 1 directories
Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384
Free inodes: 2011, 2027-4016
Group 2: (Blocks 16385-24576)
Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)
Inode table at 16387-16637 (+2)
7939 free blocks, 2008 free inodes, 0 directories
Free blocks: 16638-24576
Free inodes: 4017-6024
Group 3: (Blocks 24577-32768)
Backup superblock at 24577, Group descriptors at 24578-24578
Reserved GDT blocks at 24579-24834
Block bitmap at 24835 (+258), Inode bitmap at 24836 (+259)
Inode table at 24837-25087 (+260)
2589 free blocks, 2004 free inodes, 0 directories
Free blocks: 25088, 27109-29696
Free inodes: 6029-8032
Group 4: (Blocks 32769-40960)
Block bitmap at 32769 (+0), Inode bitmap at 32770 (+1)
Inode table at 32771-33021 (+2)
7653 free blocks, 2008 free inodes, 0 directories
Free blocks: 33022-33024, 33311-40960
Free inodes: 8033-10040
3. Group
每个ext3的文件系统是由很多个group组成的. 系统设置group是为了我们的文件系统再写入的时候,尽量在一个连续的空间上。
#如:现在有一个文件系统,很显然很多文件的大小不止4KIB的大小,那么我们的磁盘再写入的时候会尽量的连续的写入,如一个6kib文件大小的文件,会占用到位置一的block,而位置2,3的block已经被占用了,则后面的2kib会写入到位置4的block中,那么当要读取这个文件的时候,那么磁头会跳动的读取,所以读的请求会很慢。所以系统设置了group的机制,所写入的文件尽量会写入到同一个group中,尽量放在一个连续的空间上,这样会减少磁头的寻道时间。
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-511 (+260)
0 free blocks, 1989 free inodes, 2 directories
Free blocks:
Free inodes: 20-2008
Group 1: (Blocks 8193-16384)
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)
Inode table at 8453-8703 (+260)
3738 free blocks, 1991 free inodes, 1 directories
Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384
Free inodes: 2011, 2027-4016
l 其中每个group是由8192个block组成的:
Blocks per group: 8192
而每个block的大小是:
Block size: 1024
l Group 0:
所以上面的第一个block 就是superblock
Primary superblock at 1, Group descriptors at 2-2
l 在第二行有3-258 是保留的block数。
Reserved GDT blocks at 3-258
l 在第三行有block bitmap 和inode bitmap:
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
#如果是新建一个档案或目录时,我们的 Ext3是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个档案,此时档案系统的行为是:
1. 先确定使用者对于欲新增档案的目录是否具有 w 与 x 的权限,若有的话才能新增;
2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;
3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的资料写入 block 中,且更新 inode 的 block 指向资料;
4. 将刚刚写入的 inode 与 block 资料同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
一般来说,我们将 inode table 与 data block 称为资料存放区域, superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介资料),因为 superblock, inode bitmap 及 block bitmap 的资料是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的资料。
l 第四行有group0 的节点表的信息:
Inode table at 261-511 (+260)
而后面记录的就是真正可以使用的block和inode的大小:
Inode table at 8453-8703 (+260)
3738 free blocks, 1991 free inodes, 1 directories
Free blocks: 12429-12432, 12596-12800, 12809-13312, 13321-13824, 13832-14336, 14344-14848, 14857-15360, 15368-15872, 15883-16384
Free inodes: 2011, 2027-4016
l Group 1:
在第一行就记录了用来备份的superblock:
superblock很小,而且又很重要,所以系统会在后面的group1对group0的superblock做一个备份。用来防止superblock坏掉了,可以恢复。
group{1,3,5,7..}这些单数的都有对superblock的备份。
4. Fragmenation(分段)
l 连续的读取可以提升我们的性能,我们的ext2,ext3会使用一个保留的空间,来减少我们的分段。
l 保留出来的空间的目的:未来在写入一个文件的时候,或者修改一个应经存在的文件的时候,就会写入到在这个保留的空间里面,而每个写入的动作,都会占用8个block,当关闭的时候或者保存的时候,会将这8个block释放出来。当文件在在被创建的时候,和你创建目录是不一样的所使用的block数量。当扩展一个文件的时候,将尽可能的使用同一个group中的block。
l 系统在每个分区中会自动保留5%的空间来防止 无法写入。而这5%的空间只能由root来写入。
l 在修改,或创建一个文档的时候,不恰当的操作,会在同级的目录下产生一个.swp的文件,这个文件是另一个文件,其Inode值与源文件不用属于另一个文件。这个文件就是保留在内存当中的文件(就是在编辑的时候的内容是放在内存当中的)。当系统出现一些逻辑的错误,而无法启动。可以进入修复模式 ,用fsck /dev/sda1 进行修复
l 调整fragmentation的block保留数
[root@www ~]# tune2fs -m 5 /dev/sda1
tune2fs 1.39 (29-May-2006)
Setting reserved blocks percentage to 5% (12850 blocks)
#默认保留数为5%
-m:百分数
-r:直接指定保留数
#文件系统创建以后可调整,太小影响性能,太大会浪费空间。
三、 文件系统的限制
l 最大文件大小:
ext3:2TiB
GFS:16TiB(x86/32bit) or 8EiB(x86/64bit)
l 最大文件系统大小:
ext3:16TiB
GFS:16TiB(x86/32bit) or 8EiB(x86/64bit)
#1EiB=1024PiB
1PiB=1024TiB
1TiB=1024GiB
1. 查看一个文件的详细信息。
[root@www ~]# filefrag -v /root/elevator-test-0.1-3.i386.rpm
Checking /root/elevator-test-0.1-3.i386.rpm
Filesystem type is: ef53
Filesystem cylinder groups is approximately 996
Blocksize of file /root/elevator-test-0.1-3.i386.rpm is 4096
File size of /root/elevator-test-0.1-3.i386.rpm is 7981 (2 blocks)
First block: 28063768
Last block: 28063769
/root/elevator-test-0.1-3.i386.rpm: 1 extent found
2. 修复一个未挂载的文件系统
[root@www ~]# fsck /dev/sda1
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
/dev/sda1 is mounted.
#千万不要用fsck操作已挂载文件系统,很有可能破坏数据。
3. 关闭文件系统的检查功能:
[root@www ~]#tune2fs -c0 -i0 /dev/sda
#修改fsck检查时间
c0:挂载次数
i0:挂载天数,执行fsck
四、 Ext3的日志区(journaling)
日志会影响I/O的性能。日志区是存放整个文件系统的节点表里,默认情况下,日志区只会记录元数据。
#数据写入过程:先将修改的block写入日志区,然后将block写入到文件系统,写入文件系统后在释放日志区。
1. Ext3的三种日志模式
l 只有对文件系统元数据的改变才记入日志(默认)
mount -o data=ordered
l 文件系统所有数据和元数据的改变都记入日志
mount -o data=journal /dev/sdaX /mnt
#这样性能会很差,但是相对来说会很安全
l 只有对文件系统元数据的改变才记入日志,但是在完成数据的时候不会马上写入到磁盘中,而是等到闲的时候才会写入到磁盘。
mount -o data-writeback
#这样做会提高系统的性能,但是相对的也有风险
2. 日志区放到一个其他的设备上
默认情况下,日志区是和本分区是在一起的。日志区的大小必须是2的N次方,可以是4M-400M。
可以将日志区房子一个独立的设备上,但是注意,要将日志区独立放出的分区的block大小必须和新建的设备的block大小必须一样。
在做完这个分区只能用在日志功能,不能用作其他的用途,如:分了1G的大小,用来做日志区,但是只能用400M,那么后面的600M的空间不能使用。
日志区的功能不能保证数据的不丢失,而是保证数据的一致性。
l 创建日志区
[root@iscsi-server ~]#lvcreate -L 512M -n LogVol05 VolGroup00 /dev/sda3
#该分区创建后只能日志区,且只能做一个文件系统的日志区
l 将新分区格式化日志区
[root@iscsi-server ~]#mke2fs -O journal_dev -b 4096 /dev/VolGroup00/LogVol05
#block大小必须与文件系统的block大小一样也为4K
#查看原文件系统的block大小
#[root@iscsi-server ~]# tune2fs -l /dev/VolGroup00/LogVol03|grep -i "block size"
l 把原分区的日志区给取消掉
[root@iscsi-server ~]#umount /dev/VolGroup00/LogVol03
[root@iscsi-server ~]#tune2fs -O ^has_journal /dev/VolGroup00/LogVol03
l 将原分区的日志区移到新日志区上
[root@iscsi-server ~]#tune2fs -j -J device=/dev/VolGroup00/LogVol05 /dev/VolGroup00/LogVol03
#指定LogVol03的日志存放在LogVol05下
mount -o noatime :关闭访问文件时文件的访问时间更新,节省I/O资源。针对大型web后台。
mount -o commit=15:每隔15秒journal写入到文件系统里面将默认5s这样可提供性能,但容易丢失数据。
五、 RAID的调优
1. Raid 0 5 6的调优
raid 0 5 6都是采用条带化轮询的写入机制。如果raid 5 6的磁盘修改达到整个硬盘IO的20%的时候 是不太建议使用此raid的。
l Chunk size和stribe
一个数据包的大小称之为chunk size:RAID里面每个成员一次写入的数据量。当一次写入的量不到chunk size设定的大小的时候是不会写入下一个成员盘。chunk size的值必须是多个page size的大小,在X86架构下一个page size的大小是4KB即chunk size的大小必须是2的N次方 n大于1 必须是4的倍数。
stride是每次写入raid成员的block数,stride 等于 chunk size / filesystem block size
chunksize=(avgrq-sz × 512)/(raid磁盘数 × 1024)=2的N次方KBim/disk
stride=chunksize/filesystemblocksize
实例:
[root@iscsi-server ~]# iostat -x /dev/sdb
Linux 2.6.18-194.el5 (iscsi-server) 2011年08月12日
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.02 0.09 0.07 0.00 99.77
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdb 2.41 1.17 0.40 0.03 19.07 9.55 65.17 0.00 4.75 0.85 0.04
#查询磁盘的avgrq-sz,avgrq-sz是扇区数,每个扇区512Bit
Chunksize=(65.17×512)/(3×1024)=10.86=8KBit/disk
Stribe=(8KBit/disk)/(4KBit)=2
#chunksize必须是2的N次方,4的倍数
l 调整chunksize或stribe
[root@iscsi-server ~]# mdadm -C /dev/md0 -a yes -c 32 -l 5 -n 3 /dev/sdb{1,2,3}
#创建chunksize为32的raid5
[root@iscsi-server ~]# mkfs.ext3 -b 4096 -E stride=8 /dev/md0
#将/dev/md0格式化为stride=8的ext3文件系统
[root@iscsi-server ~]# cat /sys/block/mdx/md/chunk_size
[root@iscsi-server ~]# cat /proc/mdstat |grep -i chunk
[root@iscsi-server ~]# mdadm --detail /dev/mdx |grep – chunk
#查看当前条带的chunk size
l 修改raid 5的strip cache(仅对Raid 5有效)
[root@iscsi-server ~]# echo 256 > /sys/block/md0/md/strip_cache_size
#strip cache:每个磁盘同步的内存缓存,默认每个设备的128个page数。
2. RAID 1的调优(仅对Raid 1有效)
l 设置位图bitmap:保证同步失败时,下次同步时直接从改变的地方直接同步,无需从头再来。分为内部位图和外部位图
[root@iscsi-server ~]# mdadm /dev/md0 -G -b internal
#添加一个内部位图区
[root@iscsi-server ~]# mdadm /dev/md0 ---grow --bitmap=/absolute/path
#添加一个外部位图区
[root@iscsi-server ~]# mdadm -C /dev/md0 -l1 -n2 -b /tmp/md0 --write-behind=256 /dev/sdc1 --write-mostly /dev/sdd1
#在一个慢设备/dev/sdd1上创建raid,以上表示当在对设备/dev/sdc1的请求达到256个是开始往慢设备/dev/sdd1发送请求,仅对raid 1有效。