苗 杰
國家計算機網絡應急技術處理協調中心江蘇分中心
ext2和ext3文件系統在發展中遇到越來越多的擴展性問題,隨之產生了ext4文件系統。btrfs曾被稱為是下一代Linux文件系統,其目標是為了取代Linux平臺的ext3文件系統。btrfs加入了目前ext3、ext4并未支持的功能,如支持快照功能、具有COW特性(Copy-on-write)、支持創建子卷,以及在線調整文件系統大小等一系列新功能。
btrfs具有extent特性、BTree結構、SSD優化、COW特性、校驗和、快照功能、創建子卷、內建磁盤陣列、延遲分配、內聯文件、目錄索引、預分配和壓縮、修改文件系統大小、文件系統轉化以及debug功能等新特性。本節主要介紹其中如下幾種新特性。
btrfs采用了基于extent的文件存儲來減少元數據開銷,ext4也采用extent的技術來對文件進行存儲。與ext4不同的是,btrfs將所有文件的元數據保存在一個BTree中,而ext4針對每個文件,則單獨用一個BTree來保存元數據。
btrfs內部所有元數據都采用BTree管理,相比于ext4采用線性表來存儲目錄文件,則擁有良好的可擴展性。btrfs內部不同的元數據由不同的Tree管理。在superblock中由指針指向這些BTree的根。
btrfs是一種COW(copy-on-write)文件系統,btrfs在普通操作中不會直接覆蓋數據,而是將元數據和數據的新值寫到別的地方,然后在文件系統中指向新的位置,這就提供了強大的一致性和完整性保證。而ext4可以看成是一種overwrite文件系統,當更新數據時,直接對原來的數據內容進行更新。圖1是btrfs進行單一數據COW操作示意圖。

圖1 COW示意圖
A是FS Tree的根節點,若對元數據C進行更新,此時并不會立即更新C。Btrfs首先將元數據插入一個新分配的block C’中,并修改上層節點B,使其指向新的block C’;修改B也將引發COW,依此類推,引發一個連鎖反應,直到最頂層的 root A。整個過程結束,節點A’變成了FS Tree的根節點。Btrfs修改superblock 使其指向A’。圖1僅顯示了更新單一元數據COW過程,但文件系統中很多操作需要更新多個不同的元數據。利用COW 事務能保證文件系統一致性,且系統重啟后不需要執行fsck,因為superblock要么指向A,要么指向A’,無論哪個都是一致的數據。
btrfs采 用checksum技 術 來保證數據的可靠性,btrfs在讀取數據的同時會讀取其相應的checksum,采用單獨的checksum tree來管理數據塊的校驗和,將checksum和checksum保護的數據塊分離開,從而提供更嚴格的保護。ext2/ext3并沒有提供校驗和特性,對磁盤數據完全信任。而ext4采用日志校驗和特性來提高文件系統的可靠性,對數據部分并未提供校驗和保護措施。由于硬件原因,從磁盤上讀出的數據可能會出錯,即使數據從磁盤讀出正確,也很難保證數據在網絡上安全傳輸。
系統中往往存在大量的小文件,比如幾百個字節甚至更小。如果為其分配單獨的數據block,便會引起內部碎片,浪費磁盤空間。btrfs將小文件的內容保存在元數據中,不再額外分配存放文件數據的磁盤塊。改善了內部碎片問題,也增加了文件的訪問效率。
圖2 為btrfs采用inline file的示意圖。假設現在有文件file1,大小15B,file2 大小為1MB。在BTree中存在一個葉子節點,葉子節點中的extent1 metadata,extent2 metadata 分別用來表示file1和file2的磁盤使用空間。采用inline file,btrfs將大小為15 B的file1直接內嵌在元數據extent1 metadata后面。而對于大小1MB的file2,采用普通的extent表示方法,由extent2 metadata指向一段extent,存放file2。若對file1采用如綠色虛線表示,指向一個extent,由于file1僅有15 B,剩余空間便成了碎片。

圖2 內聯文件示意圖
采用inline file技術,讀file1時只需讀取extent1 metadata的block,而對于file2則先讀取extent2 metadata,再讀取其指向的extent,這便減少了磁盤IO。得益于inline file技術,btrfs處理小文件的效率非常高,也避免了磁盤碎片問題。
btrfs文件系統支持對磁盤的預分配,由于所有空間都是一次分配,因而更有可能使用連續的磁盤空間,所以能夠有效減少磁盤碎片。在將數據寫入磁盤之前進行壓縮,有時能夠大大減少磁盤IO的次數,提升IO效率。btrfs內置壓縮功能,從2.6.39內核開始默認采用lzo算法來進行壓縮和解壓,zlib算法則在2.6.39內核版本之前作為默認壓縮解壓算法。然而當壓縮使能后,整個文件系統下的所有文件都將被壓縮。
下面主要從如下幾點對btrfs和ext4進行性能對比分析。
(1)對比btrfs和ext4創建不同大小文件系統的性能,其測試結果如表1所示。

表1 創建文件系統性能對比
表1 的圖形效果如圖3所示。

圖3 創建文件系統性能對比
btrfs創建文件系統時,無論磁盤空間大小,僅創建文件系統的元數據,使用磁盤空間時再進行格式化。而ext4在創建文件系統時,不僅創建文件系統元數據,還會對磁盤進行格式化。因此創建文件系統時,ext4比btrfs需要更長的時間。
(2)對比btrfs和ext4刪除不同大小文件的性能,其測試結果如表2所示。
表2 的圖形效果如圖4所示。

表2 刪除文件性能對比

圖4 刪除文件性能對比
btrfs具有目錄索引技術,相比ext4刪除文件,btrfs刪除文件時會同時刪除文件的目錄索引,額外刪除文件的目錄索引需要時間開銷,這是造成btrfs刪除文件的性能比ext4差的原因。
(3)對比btrfs和ext4文件拷貝的性能,其測試結果如表3所示。
表3 的圖形效果如圖5所示。

圖5 文件拷貝性能對比

表3 文件拷貝性能對比
當對目錄下的大量文件進行拷貝時,btrfs是順序讀取文件進行拷貝,而ext4是通過hash方法,文件讀取的效率不如順序讀取,因此btrfs的文件拷貝性能更優。
(4)對比btrfs和ext4文件讀寫性能,利用iozone測試工具得到的結果如表4所示。

表4 文件讀寫性能對比
表4 的圖形效果如圖6所示。

圖6 文件讀寫性能對比
從上述數據可以看出,btrfs文件的隨機讀寫性能明顯優于ext4。由于btrfs的預讀寫緩存大小為4MB,而ext4的預讀寫緩存大小為128KB,這可能是導致btrfs隨機讀寫性能優于ext4的原因。
本節主要對btrfs新增的COW功能和壓縮功能進行了性能測試,主要驗證了是否開啟新功能對讀寫性能帶來的影響并進行了測試分析。
(1)對比btrfs的COW功能是否開啟對讀寫性能的影響,其測試結果如表5所示。

表5 COW功能對讀寫性能影響
表5 的圖形效果如圖7所示。

圖7 COW功能對讀寫性能影響
從上述結果可以看出btrfs開啟COW功能雖會涉及元數據操作,但并未對讀寫性能帶來較大影響。
(2)對比btrfs采用不同壓縮算法對讀寫性能的影響,其測試結果如表6所示。

表6 不同壓縮算法性能對比
表6 的圖形效果如圖8所示。

圖8 不同壓縮算法讀寫性能對比
btrfs文件系統默認掛載項并未選擇壓縮算法,若要選擇zlib或lzo壓縮算法,則需要添加相應的掛載參數。從實驗結果看出zlib和lzo壓縮算法均能大幅提升文件的讀寫效率。
本文首先簡要介紹了btrfs文件系統一些功能特性,并對比分析了btrfs與ext4文件系統在創建文件系統、刪除文件、拷貝文件、讀寫文件方面的性能差異。從實驗數據可以看出btrfs在創建文件系統、拷貝文件以及隨機讀寫文件性能明顯優于ext4,但刪除文件性能比ext4差。btrfs具有的COW機制對讀寫性能并未造成明顯影響,選擇btrfs的zlib和lzo算法可以大幅提升文件的讀寫性能。btrfs作為新一代文件系統具有良好的功能特性,目前其僅在Fedora33中成為默認的文件系統,后期有望在Linux平臺得到廣泛使用。