原文链接:https://blog.csdn.net/helloanthea/article/details/50464774
(一)测试环境
硬件环境
Inspur NF5270M3, CPU E5-2650 [email protected](2Sockect * 8Core * 2HT)
8 * 16GB of [email protected] 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 (外部日志设备)
1
2
3
4
测试均在测试分区/sdm1上进行,默认不采用外部日志。
外部日志仅在测试外部日志分区时作为对比测试项。
其他配置
关闭CPU frequency/voltage scaling
系统工作在文本模式,没有启动X图形界面
(三)参数调优及结论分析
mkfs惰性初始化
使用time工具计算命令的执行时间。
测试一:惰性初始化
$ time mke2fs -t ext4 /dev/sdm1 //惰性初始化(默认)
1
测试二:关闭惰性初始化
$ time mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1 //关闭惰性初始化
1
如图,惰性初始化的好处就是能迅速的创建文件系统,尽量把初始化的工作推迟到挂载后进行。
不建议在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)
1
2
3
4
5
测试二: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)
1
2
3
4
5
测试二: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不能同时使能。
1
2
3
4
5
采用fs_mark这个测试工具,测试写文件系统的速度。
fs_mark -n 10000 -s 100 -L 1 -S 0 -D 100 -N 100 -d /mnt/test -t 32
1
如图,可以看到写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)
1
2
3
4
测试二: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)
1
2
3
4
测试三: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)
1
2
3
fs_mark,32个线程(-t 32),fsync(缺省打开)
fs_mark -n 10000 -s 100 -L 1 -D 100 -N 100 -d /mnt/test -t 32
1
如图,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/sdm1
Journal 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
$ filebench
filebench> load fileserver
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
9
10
11
测试组二: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/sdm1
Journal 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
$ filebench
filebench> load fileserver
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
9
10
11
12
从测试结果来看,外部设备是普通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)
1
2
3
4
5
测试组二: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)
1
2
3
4
5
有电池备份可以禁用该选项以提高性能,
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
$ filebench
filebench> load fileserver
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
测试组二: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
$ filebench
filebench> load fileserver
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
调整预读索引表块大小,默认是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)
$ filebench
filebench> load filemicro_seqread
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
测试二: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)
$ filebench
filebench> load filemicro_seqread
filebench> set $dir=/mnt/test
filebench> run 60
1
2
3
4
5
6
7
8
对文件系统读操作进行优化,不记录读文件的访问时间,可以看到在小文件顺序读测试中,效果明显,noatime能减轻读操作对磁盘的频繁写入。
其他选项
dax
对于数据库这类自身设计了缓存的应用,不需要文件系统级别的缓存,可以打开dax。
sunit
swidth
用于调整RAID的条带宽度,适配RAID。
block-size
如果在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。
commit
内容同步到磁盘的时间间隔,有电池备份可适当调大。
————————————————
版权声明:本文为CSDN博主「张卓豫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/helloanthea/article/details/50464774