EXT4参数优化及测试

来源:互联网 发布:递归算法迷宫问题 编辑:程序博客网 时间:2024/06/06 10:06

(一)测试环境

  • 硬件环境

    Inspur NF5270M3, CPU E5-2650 v2@2.60GHz(2Sockect * 8Core * 2HT)
    8 * 16GB of DDR3@1.33G RAM (NUMA)
    ASPEED Graphics Family (rev 21)(used in text-only mode)
    HGST HUS724030ALA640 7200 RPM 2.7TB SATA HDD

  • 软件环境

    操作系统:CentOS Linux release 7.1.1503
    kernel版本:3.10.0-229.el7.x86_64

(二)系统配置

  • 系统分区

    /boot       /dev/sda1                       500M        ext4  /           /dev/sda2(lv: bclinux-root)     292G        xfs  /mnt        /dev/sdm1                       40G         ext4    (测试分区)               /dev/sdk1                      4G          jdb     (外部日志设备)  

    测试均在测试分区/sdm1上进行,默认不采用外部日志。
    外部日志仅在测试外部日志分区时作为对比测试项。

  • 其他配置

    关闭CPU frequency/voltage scaling
    系统工作在文本模式,没有启动X图形界面

(三)参数调优及结论分析

mkfs惰性初始化

使用time工具计算命令的执行时间。

测试一:惰性初始化

$ time mke2fs -t ext4 /dev/sdm1                                            //惰性初始化(默认)

测试二:关闭惰性初始化

$ time mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1  //关闭惰性初始化

如图,惰性初始化的好处就是能迅速的创建文件系统,尽量把初始化的工作推迟到挂载后进行。
不建议在benchmark的时候打开该选项,尤其是与其他文件系统做性能测试对比时,会影响测试结果的公允性。

三种日志模式

/dev/sdm1 on /mnt type ext4

测试一:data=writeback

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,data=writeback)

测试二:data=ordered

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,data=ordered)

测试二:data=journal

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=journal /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,nodelalloc,data=journal) //journal与delalloc不能同时使能。

采用fs_mark这个测试工具,测试写文件系统的速度。

fs_mark  -n  10000  -s  100  -L  1  -S  0  -D  100  -N  100  -d  /mnt/test  -t  32

如图,可以看到写journal模式最差,writeback略好于ordered。如果你的硬盘有电池备份,你大可使用writeback,或者ordered也可以。

journal_async_commit

/dev/sdm1 on /mnt type ext4

测试一:data=writeback,^journal_checksum,^journal_async_commit

$ mount -t ext4 -o data=writeback /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,data=writeback)

测试二:data=writeback,journal_checksum,^journal_async_commit

$ mount -t ext4 -o data=writeback,journal_checksum /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,journal_checksum,data=writeback)

测试三:data=writeback,journal_checksum,journal_async_commit

$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt/$ mount | grep mnt/dev/sdm1 on /mnt type ext4(rw,relatime,seclabel,journal_checksum,journal_async_commit,data=writeback)

fs_mark,32个线程(-t 32),fsync(缺省打开)

fs_mark  -n  10000  -s  100  -L  1  -D  100  -N  100  -d  /mnt/test  -t  32

如图,journal_async_commit虽然能够提高性能,由于journal_async_commit打开的同时也必须打开journal_checksum,我们另外测试了两组来衡量journal_checksum对性能的影响(这两组默认没有打开journal_async_commit)只测journal_checksum,从我们的测试结果来看,journal_checksum对性能影响不大,第三组打开了journal_async_commit的同时也打开了journal_checksum,性能明显提升,所以建议打开journal_async_commit。

journal_dev

测试组一:^journal_dev

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt$ tune2fs -l /dev/sdm1Journal inode:            8$ mount | grep mnt/dev/sdm1 on /mnt type ext4 (rw,relatime,seclabel,journal_checksum,journal_async_commit,data=writeback)// Filebench Version 1.4.9.1$ filebenchfilebench> load fileserverfilebench> set $dir=/mnt/testfilebench> run 60

测试组二:journal_dev

$ mke2fs -O journal_dev /dev/sdk1$ mke2fs -t ext4 -J device=/dev/sdk1 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ tune2fs -l /dev/sdm1Journal device:           0x08a2$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt$ mount | grep mnt/dev/sdm1 on /mnt type ext4 (rw,relatime,seclabel,journal_checksum,journal_async_commit,data=writeback)// Filebench Version 1.4.9.1$ filebenchfilebench> load fileserverfilebench> set $dir=/mnt/testfilebench> run 60

从测试结果来看,外部设备是普通HDD的话,对性能提升不大,推荐使用SSD/Flash设备作为外部设备。

barrier

测试组一:barrier

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt$ mount | grep mnt$ fs_mark  -n  10000  -s  100 -L  1  -S 1 -D  100  -N  100  -d  /sdm1 -t  32/dev/sdm1 on /mnt type ext4 (rw,relatime,seclabel,journal_checksum,journal_async_commit,data=writeback)

测试组二:nobarrier

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit,nobarrier /dev/sdm1 /mnt$ fs_mark  -n  10000  -s  100 -L  1  -S 1 -D  100  -N  100  -d  /sdm1 -t  32$ mount | grep mnt/dev/sdm1 on /mnt type ext4 (rw,relatime,seclabel,journal_checksum,journal_async_commit,nobarrier,data=writeback)

有电池备份可以禁用该选项以提高性能,

inode_readahead_blks

测试组一:inode_readahead_blks=32

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt$ cat /proc/fs/ext4/sdm1/options inode_readahead_blks=32$ filebenchfilebench> load fileserverfilebench> set $dir=/mnt/testfilebench> run 60

测试组二:inode_readahead_blks=4096

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit,inode_readahead_blks=4096 /dev/sdm1 /mnt$ cat /proc/fs/ext4/sdm1/options inode_readahead_blks=4096$ filebenchfilebench> load fileserverfilebench> set $dir=/mnt/testfilebench> run 60

调整预读索引表块大小,默认是32,调整为4096,可以看到IO吞吐量得到极大提升。

noatime

测试一:reltime

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit /dev/sdm1 /mnt$ mount | grep mnt/dev/sdm on /mnt type ext4 (rw,relatime,seclabel,journal_checksum,journal_async_commit,data=writeback)$ filebenchfilebench> load filemicro_seqreadfilebench> set $dir=/mnt/testfilebench> run 60

测试二:noatime

$ mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1$ mount -t ext4 -o data=writeback,journal_async_commit,noatime /dev/sdm1 /mnt$ mount | grep mnt/dev/sdm1 on /sdm1 type ext4 (rw,noatime,seclabel,journal_checksum,journal_async_commit,data=writeback)$ filebenchfilebench> load filemicro_seqreadfilebench> set $dir=/mnt/testfilebench> run 60

对文件系统读操作进行优化,不记录读文件的访问时间,可以看到在小文件顺序读测试中,效果明显,noatime能减轻读操作对磁盘的频繁写入。

其他选项

dax
对于数据库这类自身设计了缓存的应用,不需要文件系统级别的缓存,可以打开dax。
sunit
swidth
用于调整RAID的条带宽度,适配RAID。
block-size
如果在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。
commit
内容同步到磁盘的时间间隔,有电池备份可适当调大。

0 0