簡介
XfS檔案系統是SGI開發的高級日誌檔案系統,XFS極具伸縮性,非常健壯。所幸的是SGI將其移植到了Linux系統中。在linux環境下。目前版本可用的最新XFS檔案系統的為1.2版本,可以很好地工作在2.4核心下。
XFS 是 Silicon Graphics,Inc. 於 90 年代初開發的。它至今仍作為 SGI 基於 IRIX 的產品(從
工作站到
超級計算機)的底層檔案系統來使用。現在,XFS 也可以用於 Linux。XFS 的 Linux 版的到來是激動人心的,首先因為它為 Linux 社區提供了一種健壯的、優秀的以及功能豐富的檔案系統,並且這種檔案系統所具有的可伸縮性能夠滿足最苛刻的存儲需求。
歷史
XFS的開發始於1993年,在1994年被首次部署在IRIX 5.3上。2000年5月,XFS在
GNU通用公共許可證下發布,並被移植到Linux上。2001年XFS首次被Linux發行版所支持,現在所有的Linux發行版上都可以使用XFS。
特性
主要特性包括以下幾點:
數據完全性
採用XFS檔案系統,當意想不到的宕機發生後,首先,由於檔案系統開啟了日誌功能,所以你磁碟上的檔案不再會意外宕機而遭到破壞了。不論目前檔案系統上存儲的檔案與數據有多少,檔案系統都可以根據所記錄的日誌在很短的時間內迅速恢復磁碟檔案內容。
傳輸特性
XFS檔案系統採用最佳化算法,日誌記錄對整體檔案操作影響非常小。XFS查詢與分配存儲空間非常快。xfs檔案系統能連續提供快速的反應時間。筆者曾經對XFS、JFS、Ext3、ReiserFS檔案系統進行過測試,XFS檔案檔案系統的性能表現相當出眾。
可擴展性
XFS 是一個全64-bit的檔案系統,它可以支持上百萬T位元組的存儲空間。對特大檔案及小尺寸檔案的支持都表現出眾,支持特大數量的目錄。最大可支持的檔案大 小為263 = 9 x 1018 = 9 exabytes,最大檔案系統尺寸為18 exabytes。
XFS使用高的表結構(B+樹),保證了檔案系統可以快速搜尋與快速空間分配。XFS能夠持續提供高速操作,檔案系統的性能不受目錄中目錄及檔案數量的限制。
傳輸頻寬
XFS 能以接近裸設備I/O的性能存儲數據。在單個檔案系統的測試中,其吞吐量最高可達7GB每秒,對單個檔案的讀寫操作,其吞吐量可達4GB每秒。
規範
容量
XFS是一個
64位檔案系統,最大支持 8exbibytes 減1位元組的單個檔案系統,實際部署時取決於宿主作業系統的最大塊限制。對於一個
32位Linux系統,檔案和檔案系統的大小會被限制在 16tebibytes。
檔案系統日誌
日誌檔案系統是一種即使在斷電或者是作業系統崩潰的情況下保證檔案系統一致性的途徑。XFS對檔案系統
元數據提供了日誌支持。當檔案系統更新時,
元數據會在實際的磁碟塊被更新之前順序寫入日誌。XFS的日誌被保存在
磁碟塊的循環緩衝區上,不會被正常的檔案系統操作影響。XFS日誌大小的上限是64k個塊和128MB中的較大值,下限取決於已存在的檔案系統和目錄的塊的大小。在外置設備上部署日誌會浪費超過最大日誌大小的空間。XFS日誌也可以被存在檔案系統的數據區(稱為內置日誌),或者一個額外的設備上(以減少磁碟操作)。
XFS的
日誌保存的是在更高層次上描述已進行的操作的“邏輯”實體。相比之下,“物理”
日誌存儲每次
事務中被修改的塊。為了保證性能,
日誌的更新是異步進行的。當
系統崩潰時,崩潰的一瞬間之前所進行的所有操作可以利用
日誌中的數據重做,這使得XFS能保持檔案系統的一致性。XFS在掛載檔案系統的同時進行恢復,恢復速度與檔案系統的大小無關。對於最近被修改但未完全寫入
磁碟的數據,XFS保證在重啟時清零所有未被寫入的
數據塊,以防止任何有可能的、由剩餘數據導致的安全隱患(因為雖然從檔案系統接口無法訪問這些數據,但不排除
裸設備或裸硬體被直接讀取的可能性)。
分配組
XFS檔案系統內部被分為多個“分配組”,它們是檔案系統中的等長線性存儲區。每個分配組各自管理自己的
inode和剩餘空間。檔案和資料夾可以跨越分配組。這一機制為XFS提供了可伸縮性和並行特性——多個
執行緒和進程可以同時在同一個檔案系統上執行I/O操作。這種由分配組帶來的內部分區機制在一個檔案系統跨越多個
物理設備時特別有用,使得最佳化對下級存儲部件的
吞吐量利用率成為可能。
條帶化分配
基於Extent的分配方式
XFS檔案系統中的檔案用到的塊由變長
Extent管理,每一個Extent描述了一個或多個連續的塊。相比將每個檔案用到的所有的塊存儲為列表的檔案系統,這種策略大幅縮短了列表的長度。有些檔案系統用一個或多個面向塊的柵格管理空間分配——在XFS中這種結構被由一對
B+樹組成的、面向Extent的結構替代了;每個檔案系統分配組(AG)包含這樣的一個結構。其中,一個
B+樹用於索引未被使用的Extent的長度,另一個索引這些Extent的起始塊。這種雙索引策略使得檔案系統在定位剩餘空間中的Extent時十分高效。
可變塊尺寸
塊是檔案系統中的最小可
分配單元。XFS允許在創建檔案系統時指定塊的大小,從 512
位元組到 64KB,以適應專門的用途。比如,對於有很多小檔案的套用,較小的塊尺寸可以最大化
磁碟利用率;但對於一個主要處理大檔案的系統,較大的塊尺寸能提供更好的性能。
延遲分配
主條目:延遲分配
XFS在檔案分配上使用了惰性計算技術。當一個檔案被寫入快取時,XFS簡單地在記憶體中對該檔案保留合適數量的塊,而不是立即對數據分配Extent。實際的塊分配僅在這段數據被沖刷到磁碟時才發生。這一機制提高了將這一檔案寫入一組連續的塊中的機會,減少
碎片的同時提升了性能。
稀疏檔案
XFS對每個檔案提供了一個
64位的稀疏地址空間,使得大檔案中的“洞”(空白數據區)不被實際分配到磁碟上。因為檔案系統對每個檔案使用一個Extent表,檔案分配表就可以保持一個較小的體積。對於太大以至於無法存儲在
inode中的分配表,這張表會被移動到
B+樹中,繼續保持對該目標檔案在
64位地址空間中任意位置的數據的高效訪問。
擴展屬性
XFS通過實現
擴展檔案屬性給檔案提供了多個數據流,使檔案可以被附加多個名/值對。檔案名稱是一個最大長度為256位元組的、以NULL字元結尾的可列印字元串,其它的關聯值則可包含多達 64KB 的二進制數據。這些數據被進一步分入兩個名字空間中,root和user。保存在root名字空間中的擴展屬性只能被超級用戶修改,user名字空間中的可以被任何對該檔案擁有寫許可權的用戶修改。擴展屬性可以被添加到任意一種XFS
inode上,包括符號連結、設備節點、目錄,等等。可以使用 attr 這個命令行程式操作這些擴展屬性。xfsdump 和 xfsrestore 工具在進行備份和恢復時會一同操作擴展屬性,而其它的大多數備份系統則會忽略擴展屬性。
Direct I/O
對於要求高吞吐量的套用,XFS給用戶空間提供了直接的、非快取I/O的實現。數據在應用程式的緩衝區和磁碟間利用
DMA進行傳輸,以此提供下級磁碟設備全部的I/O頻寬。
確定速率 I/O
XFS確定速率I/O系統給應用程式提供了預留檔案系統頻寬的
API。XFS會動態計算下級存儲設備能提供的性能,並在給定的時間內預留足夠的頻寬以滿足所要求的性能。此項特性是XFS所獨有的。確定方式可以是硬性的或軟性的,前者提供了更高性能,而後者相對更加可靠。不過只要下級存儲設備支持硬性速率確定,XFS就只允許硬性模式。這一機制最常被用在實時套用中,比如視頻流。
DMAPI
XFS實現了數據管理應用程式接口(DMAPI)以支持高階存儲管理(HSM)。到2010年10月為止,Linux上的XFS實現已經支持DMAPI所要求的的磁碟
元數據規範,但有報告稱核心支持仍處於不穩定狀態。此前SGI曾提供了一個包含DMAPI鉤子的核心源碼樹,但這個支持未被合併進主代碼樹。不過現在核心開發者們已經注意到了它並對其做了更新。
快照
XFS並不直接提供對檔案系統快照的支持,因為XFS認為快照可在卷管理器中實現。對一個XFS檔案系統做快照需要調用 xfs_freeze 工具凍結檔案系統的I/O,然後等待卷管理器完成實際的快照創建,再解凍I/O,繼續正常的操作。之後這個快照可以被當作備份,以唯讀方式掛載。在IRIX上發布的XFS包含了一個整合的卷管理器,叫XLV。這個卷管理器無法被移植到Linux上,不過XFS可以和Linux上標準的
LVM正常工作。在最近發布的Linux核心中,xfs_freeze 的功能被實現在了VFS層,當卷管理器的快照功能被喚醒時將自動啟動 xfs_freeze。相對於無法掛起,卷管理器也無法對其創建“熱”快照的
ext3檔案系統,XFS的快照功能具有很大優勢。幸運地是,現在這種情況已經改觀。從Linux 2.6.29核心開始,
ext3,
ext4, gfs2和
jfs檔案系統也獲得了凍結檔案系統的特性。
線上碎片整理
雖然XFS基於Extent的特徵和延遲分配策略顯著提高了檔案系統對
碎片問題的抵抗力,XFS還是提供了一個檔案系統
碎片整理工具,xfs_fsr(XFS filesystem reorganizer的簡稱)。這個工具可以對一個已被掛載、正在使用中的XFS檔案系統進行
碎片整理。
線上尺寸調整
XFS提供了 xfs_growfs 工具,可以線上調整XFS檔案系統的大小。XFS檔案系統可以向保存當前檔案系統的設備上的未分配空間延伸。這個特性常與
卷管理功能結合使用,因為後者可以把多個設備合併進一個邏輯卷組,而使用
硬碟分區保存XFS檔案系統時,每個分區需要分別擴容。到2010年8月為止,XFS分區不可以原位收縮,不過有一些方法可以變相處理這個問題。
原生備份/恢復工具
XFS提供了 xfsdump 和 xfsrestore 工具協助備份XFS檔案系統中的數據。xfsdump 按
inode順序備份一個XFS檔案系統。與傳統的UNIX檔案系統不同,XFS不需要在dump前被卸載;對使用中的XFS檔案系統做dump就可以保證鏡像的一致性。這與XFS對快照的實現不同,XFS的dump和restore的過程是可以被中斷然後繼續的,無須凍結檔案系統。xfsdump 甚至提供了高性能的多執行緒備份操作——它把一次dump拆分成多個數據流,每個數據流可以被發往不同的目的地。不過到目前為止,Linux尚未完成對多數據流dump功能的完整移植。
原子磁碟配額
XFS的磁碟配額在檔案系統被初次掛載時啟用。這解決了一個在其它大多數檔案系統中存在的一個競爭問題:要求先掛載檔案系統,但直到調用quotaon(8)之前配額不會生效。
性能考慮
寫入屏障
XFS檔案系統默認在掛載時啟用“寫入屏障”的支持。該特性會一個合適的時間沖刷下級存儲設備的寫回快取,特別是在XFS做日誌寫入操作的時候。這個特性的初衷是保證檔案系統的一致性,具體實現卻因設備而異——不是所有的下級硬體都支持
快取沖刷請求。在帶有電池供電快取的硬體RAID控制器提供的邏輯設備上部署XFS檔案系統時,這項特性可能導致明顯的性能退化,因為檔案系統的代碼無法得知這種快取是非易失性的。如果該控制器又實現了沖刷請求,數據將被不必要地頻繁寫入
物理磁碟。為了防止這種問題,對於能夠在斷電或發生其它主機
故障時保護快取中數據的設備,應該以 nobarrier 選項掛載XFS檔案系統。
日誌的放置
XFS檔案系統創建時默認使用內置
日誌,把日誌和檔案系統數據放置在同一個
塊設備上。由於在所有的檔案系統寫入發生前都要更新日誌中的
元數據,內置日誌可能導致磁碟競爭。在大多數負載下,這種等級的競爭非常低以至於對性能沒有影響。但對於沉重的隨機寫入負載,比如在忙碌的
數據塊伺服器上,XFS可能因為這種I/O競爭無法獲得最佳性能。另一個可能提高這個問題的嚴重性的因素是,日誌寫入被要求以同步方式提交——它們必須被完全寫入,之後對應實際數據的寫入操作才能開始。
如果確實需要最佳的檔案系統性能,XFS提供了一個選項,允許把
日誌放置在一個分離的
物理設備上。這只需要很小的物理空間。分離的設備有自己的I/O路徑,如果該設備能對同步寫入提供低延遲的路徑,那么它將給整個檔案系統的操作帶來顯著的性能提升。
SSD,或帶有寫回快取的RAID系統是日誌設備的合適候選,它們能滿足這種性能要求。不過後者在遭遇斷電時可能降低數據的安全性。要啟用外部日誌,只須以 logdev 選項掛載檔案系統,並指定一個合適的日誌設備即可。
缺點
XFS檔案系統無法被收縮。
歷史上XFS上的
元數據操作曾比其它檔案系統都慢,表現為在刪除大量小檔案時性能糟糕。該性能問題是被
Red Hat的XFS開發者Dave Chinner在代碼中定位到的。使用一個叫“延遲記錄”的掛載選項可以成數量級地提升
元數據操作的性能。該選項幾乎把
日誌整個存在記憶體中。Linux核心主線版本2.6.35中作為一個試驗性特性引入了這個補丁,在2.6.37中使它成為了一個穩定的特性,並計畫在2.6.39中把它作為默認的日誌記錄方法。早期測試顯示在有少量執行緒的環境中其性能接近EXT4,在大量執行緒的環境下超過了EXT4。