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

相關文章
相關標籤/搜索