EXT4参数优化及测试---转载

原文连接:https://blog.csdn.net/helloanthea/article/details/50464774
(一)测试环境
硬件环境node

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 HDDlinux

软件环境数据库

操做系统: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上进行,默认不采用外部日志。
外部日志仅在测试外部日志分区时做为对比测试项。async

其余配置工具

关闭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。sunitswidth用于调整RAID的条带宽度,适配RAID。block-size若是在你的文件系统中是一些比较大的文件的话,使用较大的块大小将获得较好的性能。使用多大的块大小,须要根据你的系统综合考虑,若是系统用做邮件或者新闻服务器,使用较大的块大小,虽然性能有所提升,但会形成磁盘空间较大的浪费。commit内容同步到磁盘的时间间隔,有电池备份可适当调大。————————————————版权声明:本文为CSDN博主「张卓豫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/helloanthea/article/details/50464774

相关文章
相关标签/搜索