引言:磁盤容量越來越大,文件系統管理的文件也是越來越大、越來越多,如何破解?唯有快!於是動態分配、B+樹開始登上舞台。還記得當年MySQL的索引結構嗎,好的作品所見略同。
一、XFS為什么替換Ext4?
前面我們介紹過Linux ext系列的文件系統,我想ext系列應該是文件系統史上非常經典的傑作。在CentOS 7之前都是默認采用的這一系列文件系統。但是從CentOS 7開始默認的文件系統變成了xfs文件系統,為啥?
ext系列雖然支持度最廣,但是格式化超慢。
ext文件系統系列對於文件格式化的處理方面,采用的是預先規划出所有inode、區塊、元數據等數據,未來系統可以直接使用,不需要再進行動態配置的做法。即固定分配好文件系統所需的各種數據,不支持動態分配。這種做法,對於早期磁盤容量是合適的,但是對於當前大容量的磁盤缺陷就很明顯了,例如TB以上等級傳統的ext系列文件系統在格式化的時候,光是系統要預先分配inode與區塊就消耗好多時間。我們項目在采用CentOS 6.5的時候,格式化一個10多點T的時候花費的時間是以小時為單位計算。
二、XFS數據分布的變化
xfs文件系統在數據的分布上,相對於ext系列有明顯的變化,主要規划為三個部分,一個數據區,一個文件系統登錄區,一個實時運行區。
1、數據區,data section
基本上,數據區和我們之前介紹的ext系列一樣,包括inode,數據塊,超級塊等數據。這個數據區也和ext系列的塊組類似,也分為多個塊組,不過xfs稱作AG(allocation groups,分配組)。但是,它的inode與數據塊都是系統需要用到時才動態配置的,所以格式化操作非常快。而且,xfs的邏輯塊block與inode有多種不同的容量可供設置。但是因存儲控制的關系(頁面文件pagesize的容量一般4K),建議塊的大小最好也是4K,而inode最好為256B。關於頁面和磁盤的一些關系和知識后續章節再介紹。
文件和文件夾可以跨越分配組。這一機制為XFS提供了可伸縮性和並行特性——多個線程和進程可以同時在同一個文件系統上執行I/O操作。這種由分配組帶來的內部分區機制在一個文件系統跨越多個物理設備時特別有用,使得優化對下級存儲部件的吞吐量利用率成為可能。
2、文件系統登錄區,log section
也稱為日志區,用來記錄文件系統的變化。文件的變化會在這里記錄下來,直到該變化完整的寫入數據區后,該條記錄才會被結束。日志的作用是保證文件系統的一致性。
因為所有的文件操作都會在這個區做記錄,因此這個區塊的磁盤活動相當頻繁,所以你可以指定外部的磁盤例如SSD來作為xfs文件系統的日志區。
3、實時運行區, realtime section
當有文件要被創建時,xfs會在這個區段里面找到一個到數個extend區塊,將文件放置在這個區塊內,等待分配完成后,再寫入到data section的inode與區塊中。這個區塊的大小要在格式化的時候就先指定,最小值4K最大到1G。 (一般非磁盤陣列的磁盤默認64K,而具有類似盤陣的stripe情況下,建議extend設置與stripe一樣大。)
總之實時運行區段由變長Extent管理,B+樹組成。
其中,一個B+樹用於索引未被使用的Extent的長度,另一個索引這些Extent的起始塊。這種雙索引策略使得文件系統在定位剩余空間中的Extent時十分高效。
因為文件系統對每個文件使用一個Extent表,文件分配表就可以保持一個較小的體積。對於太大以至於無法存儲在inode中的分配表,這張表會被移動到B+樹中,繼續保持對該目標文件在64位地址空間中任意位置的數據的高效訪問。
最后,xfs的這些數據可以通過什么命令來查看呢?像ext系列的dumpe2fs,xfs使用xfs_info來查看超級區塊內容,AG大小尺寸以及extent的大小等等。
三、XFS的定義與特性
XFS一種高性能的日志文件系統,最早於1993年,由Silicon Graphics為他們的IRIX操作系統而開發,是IRIX 5.3版的默認文件系統。2000年5月,Silicon Graphics以GNU通用公共許可證發布這套系統的源代碼,之后被移植到Linux 內核上。XFS 特別擅長處理大文件,同時提供平滑的數據傳輸。
xfs在很多方面確實做的比ext4好,ext4受限制於磁盤結構和兼容問題,可擴展性和scalability確實不如xfs,另外xfs經過很多年發展,各種鎖的細化做的也比較好。
1、數據完全性
2、傳輸特性
3、可擴展性
4、數據結構
5、傳輸帶寬
總之,XFS有許多獨特的性能提升功能使他從眾多文件系統中脫穎而出,像可伸縮/並行IO,元數據日志,熱碎片整理,IO暫停/恢復,延遲分配等。
但是,XFS文件系統有一些缺陷,例如它不能壓縮,刪除大量文件時性能低下。
對於xfs性能缺陷,網上也有高手提出了解決方案(https://www.jianshu.com/p/ac28162d08fd):
mkfs.xfs -f -i size=512-l size=128m,lazy-count=1-d agcount=16/dev/sdb1
參考資料:
《鳥哥的Linux私房菜》基礎篇 第四版。
百度百科 XFS。