Linux的文件系統有點像MySQL的存儲引擎,它支持各種各樣的文件系統。它最上層是通過 virtual files system虛擬文件系統作為一個抽象接口層來對外提供調用的。然後下層的各種文件系統實現這些調用接口就行了。
1. Linux 中的 日志文件系統和非日志文件系統
文件內容的修改涉及到兩部分:實際文件內容的修改 和 文件元(metadata)信息的修改。所以在修改一個成功之後,修改另一個之前,此時系統崩潰,就會導致兩者的不一致。所以提出了日志文件系統的概念。
所謂的日志文件系統(Journaling file system),就是在實際修改文件內容和文件元信息之前,將他們的修改先寫到一個日志中(journal log)。這樣的話,如果發生系統崩潰,就可以使用日志進行恢復。當然,寫日志會對文件系統的性能有一定的影響。除了ext2之外,其它文件系統幾乎都是日志文件系統。
日志文件系統的處理過程是:1)先寫日志;2)然後寫實際的文件系統;3)刪除日志;
日志文件系統又可以分成三種類型:
1)日志模式(journal): 將所有的元數據和數據改變均寫入日志,對性能影響最大;
2)預定模式(ordered): 只記錄元數據的變化, 在數據寫入磁盤後再修改元數據,對性能影響中等;
3)寫回模式(writeback): 只記錄元數據的修改變化,對數據修改順序無要求,對性能影響最小;
我們可以在/etc/fstab 文件中修改文件系統的日志模式。
/dev/sdb1 /testfs ext3 defaults,data=writeback 0 0
Linux 常用文件系統:
ext4, ext4, XFS, ReiserFS, JFS
其中最常用的是 ext4, XFS. 其中redhat7/centos7將XFS作為默認的文件系統。在最新內核的測試中XFS性能也明顯超過ext4。所以對於mysql服務器,最好選擇使用 XFS 文件系統。
關於 ssd上的ext4和xfs有一個比較:
https://www.percona.com/blog/2012/03/15/ext4-vs-xfs-on-ssd/
在rhel6.4之前ext4性能比xfs好,因為xfs有lock爭用的bug。但是6.4開始,xfs的bug被fix了。所以xfs性能比ext4好。
在xfs的鎖爭用bug沒有解決時:
sync async threads throughput throughput XFS ext4 XFS ext4 1 1.90/124k 1.41/92k 1.72/112k 1.41/92k 2 1.01/64k 1.65/108k 0.97/62k 1.65/108k 4 0.27/17k 1.55/102k 0.21/13k 1.55/102k 8 0.13/8k 1.45/95k 0.15/9k 1.45/95k 16 0.12/7k 1.45/95k 0.12/7k 1.45/95k
It’s pretty clear from these results that lock contention is killing XFS as the thread count grows. ext4 performance shows that it uses exclusive locking as well, but it is not degrading like XFS is due to different lock types being used.
但是當xfs的鎖爭用bug解決之後:
sync async threads throughput throughput vanilla patched vanilla patched 1 1.90/124k 1.83/120k 1.72/112k 1.69/111k 2 1.01/64k 2.85/185k 0.97/62k 2.57/168k 4 0.27/17k 3.68/241k 0.21/13k 3.41/223k 8 0.13/8k 4.42/290k 0.15/9k 4.16/273k 16 0.12/7k 4.95/325k 0.12/7k 4.86/319k
Throughput scales with thread count – each thread runs at 100% CPU utilsation, and XFS gets up to 3x as much throughput as ext4 does. So, basically, XFS is still the file system you want for direct IO。
掛在文件時的優化(noatime,nodiratime):
mount –t ext4 –o rw,noatime,nodiratime /dev/sda6 /data
noatime 會有0-10%的性能提升,一般平均會有3%的性能提升。
noatime:
Do not update inode access times on this filesystem (e.g, for faster access on the news spool to speed up news servers).
nodiratime:
Do not update directory inode access times on this filesystem.
noatime,nodiratime的配置也可以在/etc/fstab中進行。