天天看點

剖析 ext4

Linux 核心的每次發行都伴随一些驚喜,今年 12 月份發行的 2.6.28 也不例外。這個發行版是首個穩定的 ext4 檔案系統(它還包含其他出色的特性,比如正在開發的 Btrfs)。這個下一代擴充檔案系統提供更好的伸縮性、可靠性和許多新功能。ext4 的伸縮性如此之大,以緻最大的檔案系統所用的磁盤空間将達到 100 萬 TB。

擴充檔案系統的簡史

虛拟檔案系統交換

VFS 是一個從上層檔案系統使用者提取底層檔案系統細節的層。在提取過程中,VFS 允許在特定 Linux 系統上同時支援多檔案系統。

第一個受 Linux 支援的檔案系統是 Minix 檔案系統。這個檔案系統有嚴重的性能問題,是以出現了另一個針對 Linux 的檔案系統,即擴充檔案系統。第 1 個擴充檔案系統(ext1)由 Remy Card 設計,并于 1992 年 4 月引入到 Linux 中。ext1 檔案系統是第一個使用虛拟檔案系統(VFS)交換的檔案系統。虛拟檔案系統交換是在 0.96c 核心中實作的,支援的最大檔案系統為 2 GB。

第 2 個擴充檔案系統(ext2)也是由 Remy Card 實作的,并于 1993 年 1 月引入到 Linux 中。它借鑒了當時檔案系統(比如 Berkeley Fast File System [FFS])的先進想法。ext2 支援的最大檔案系統為 2TB,但是 2.6 核心将該檔案系統支援的最大容量提升到 32TB。

閱讀 Tim Jones 在 developerWorks 上發表的其他文章

  • Tim 撰寫的剖析…… 系列文章

第 3 個擴充檔案系統(ext3)是 Linux 檔案系統的重大改進,盡管它在性能方面遜色于某些競争對手。ext3 檔案系統引入了日志 概念,以在系統突然停止時提高檔案系統的可靠性。雖然某些檔案系統的性能更好(比如 Silicon Graphics 的 XFS 和 IBM® Journaled File System [JFS]),但 ext3 支援從使用 ext2 的系統進行就地(in-place)更新。ext3 由 Stephen Tweedie 實作,并于 2001 年 11 月引入。

今天,我們已經擁有第 4 個擴充檔案系統(ext4)。ext4 在性能、伸縮性和可靠性方面進行了大量改進。最值得一提的是,ext4 支援 1 EB 的檔案系統。ext4 是由 Theodore Tso(ext3 的維護者)上司的開發團隊實作的,并引入到 2.6.19 核心中。目前,它在 2.6.28 核心中已經很穩定(到 2008 年 12 月為止)。

ext4 從競争對手那裡借鑒了許多有用的概念。例如,在 JFS 中已經實作了使用區段(extent)來管理塊。另一個與塊管理相關的特性(延遲配置設定)已經在 XFS 和 Sun Microsystems 的 ZFS 中實作。

在 ext4 檔案系統中,您可以發現各種改進和創新。這些改進包括新特性(新功能)、伸縮性(打破目前檔案系統的限制)和可靠性(應對故障),當然也包括性能的改善。

回頁首

功能

ext4 引入了大量新功能,但最重要的是與 ext3 的向後和向前相容性,以及在時間戳上的改進。這些改進立足于提高未來的 Linux 系統的性能。

向後和向前相容性

由于 ext3 是 Linux 上最受歡迎的檔案系統之一,是以應該能夠輕松遷移到 ext4。為此,ext4 被設計為在 extent 方面具有向後和向前相容性(參見圖 1)。ext4 與 ext3 是向前相容的,這樣就可以将 ext3 檔案系統挂載為 ext4 檔案系統。為了充分利用 ext4 的優勢,必須實作檔案系統的遷移,以轉換和利用新的 ext4 格式。您還可以将 ext4 挂載為 ext3(向後相容),但前提是 ext4 檔案系統不能使用區段(将在性能小節對其進行讨論)。

圖 1. ext4 的向後和向前相容性
剖析 ext4

除了相容性特性之外,您還可以逐漸地将 ext3 檔案系統遷移到 ext4。這意味着沒有移動的舊檔案可以保留 ext3 格式,但新的檔案(或已被複制的舊檔案)将采用新的 ext4 資料結構。您可以通過這種方式線上将 ext3 檔案系統遷移到 ext4 檔案系統。

提高時間戳分辨率和擴充範圍

令人驚訝的是,ext4 之前的擴充檔案系統的時間戳都是以秒為機關的。這已經能夠應付大多數設定,但随着處理器的速度和內建程度(多核處理器)不斷提升,以及 Linux 開始向其他應用領域發展(比如高性能計算),基于秒的時間戳已經不夠用。ext4 設計時間戳時考慮到未來的發展,它将時間戳的機關提升到納秒。ext4 給時間範圍添加了兩個位,進而讓時間壽命再延長 500 年。

伸縮性

檔案系統未來發展的一個重要方面就是伸縮性,即根據需求進行伸縮的能力。ext4 以多種方式現實了強大的伸縮性,它的伸縮性超越了 ext3,并且在檔案系統中繼資料管理方面開辟了新領域。

突破檔案系統的限制

ext4 的一個明顯差别就是它支援更大的檔案系統、檔案和子目錄。ext4 支援的最大檔案系統為 1 EB(1000 PB)。雖然根據今天的标準這個檔案系統已經非常巨大,但存儲空間的消費會不斷增長,是以 ext4 必須考慮到未來的發展。ext4 支援最大 16 TB 的檔案(假設由 4KB 的塊組成),這個容量是 ext3 的 8 倍。

最後,ext4 也擴充了子目錄的容量,将其從 32KB 擴充到無窮大。這是極端情況,我們還需要考慮檔案系統的層次結構,因為它的最大存儲容量為 1 EB。此外,目錄索引也優化為類似于散列 B 樹結構,是以盡管限制更加多,但 ext4 支援更快的查找。

區段

ext3 配置設定空間的方式是其主要缺點之一。ext3 使用空閑空間位映射來配置設定檔案,這種方式不是很快,并且伸縮性不強。ext3 的格式對小檔案而言是很高效的,但對于大檔案則恰恰相反。ext4 使用區段取代 ext3 的機制,進而改善了空間的配置設定,并且支援更加高效的存儲結構。區段 是一種表示一組相鄰塊的方式。使用區段減少了中繼資料,因為區段維護關于一組相鄰塊的存儲位置的資訊(進而減少了總體中繼資料存儲),而不是一個塊的存儲位置的資訊。

ext4 的區段采用分層的方法高效地表示小檔案,并且使用區段樹高效地表示大檔案。例如,單個 ext4 inode 有足夠的空間來引用 4 個區段(每個區段表示一組相鄰的塊)。對于大檔案(包括片段檔案),一個 inode 能夠引用一個索引節點,而每個索引節點能夠引用一個葉節點(引用多個區段)。這種持續的區段樹為大檔案(尤其是分散的檔案)提供豐富的表示方式。這些節點還包含自主檢查機制,以阻止檔案系統損壞帶來威脅。

性能

衡量一個新檔案系統的最重要名額就是它的根本性能。這常常是最難實作的名額,因為當檔案系統變得龐大并且要求實作高可靠性時,将會以損害性能為代價。但是,ext4 不僅解決了伸縮性和可靠性,它還提供各種改善性能的方法。

檔案級預配置設定

某些應用程式,比如資料庫或内容流,要求将檔案存儲在相鄰的塊上(利用相鄰塊的讀優化和最大化讀的指令-塊比率)。盡管區段能夠将相鄰塊劃分為片段,但另一種更強大的方法是按照所需的大小預配置設定比較大的相鄰塊(XFS 以前就是采用這種方法)。ext4 通過一個新的系統調用來實作這個目的,這個調用将按照特定的大小預配置設定并初始化檔案。然後,您就可以寫入必要的資料,并為資料提供不錯的讀性能。

延遲塊配置設定

另一個基于檔案大小的優化是延遲配置設定。這種性能優化延遲磁盤上的實體塊的配置設定,直到塊被刷入到磁盤時才進行配置設定。這種優化的關鍵是延遲實體塊的配置設定,直到需要在磁盤上寫這些實體塊時才對其進行配置設定并寫到相鄰的塊。這類似于持久化預配置設定,惟一的差別是檔案系統會自動執行這項任務。不過如果預先知道檔案的大小時,持久化預配置設定是更好的選擇。

多個塊配置設定

這是最後一個與相鄰塊相關的優化,即針對 ext4 的塊配置設定器。在 ext3 中,塊配置設定器的工作方式是每次配置設定一個塊。當需要配置設定多個塊時,非相鄰塊中可能存在相鄰的資料。ext4 使用塊配置設定器修複了這個問題,它能夠在磁盤上一次配置設定多個塊。與前面其他優化一樣,這個優化在磁盤上收集相關的資料,以實作相鄰讀優化。

多個塊配置設定的另一個方面是配置設定塊時需要的處理量。記住,ext3 一次隻配置設定一個塊。在最簡單的情況下,每個塊的配置設定都要有一個調用。如果一次配置設定多個塊,對塊配置設定器的調用就會大大減少,進而加快配置設定并減少處理量。

可靠性

ext4 檔案系統可能會擴充得比較大,這将導緻可靠性問題。但 ext4 通過許多自主保護和自主修複機制來解決這個問題。

執行檔案系統日志校驗和

和 ext3 一樣,ext4 也是一個日志檔案系統。日志記錄 就是通過日記(磁盤上相鄰區域的專門循環記錄)記錄檔案系統的變更的過程。是以,根據日志對實體存儲執行實際變更更加可靠,并且能夠確定一緻性,即使在操作期間出現系統崩潰或電源中斷。這樣做可以減少檔案系統損壞的幾率。

但是即使進行日志記錄,如果日志出現錯誤仍然會導緻檔案系統損壞。為了解決這個問題,ext4 對日志執行校驗和,確定有效變更能夠在底層檔案系統上正确完成。在 參考資料 小節可以找到其他關于日志記錄(ext4 的重要部分)的資料。

ext4 支援根據使用者需求采用多種模式的日志記錄。例如,ext4 支援 Writeback 模式,它僅記錄中繼資料;或 Ordered 模式,它記錄中繼資料,但寫為中繼資料的資料是從日志中寫入的;或 Journal 模式(最可靠的模式),它同時記錄中繼資料和資料。注意,雖然 Journal 模式是確定檔案系統一緻的最佳選擇,但它也是最慢的,因為所有資料都要經過日志。

線上磁盤碎片整理

盡管 ext4 添加一些特性來減少檔案系統的碎片(比如将相鄰塊配置設定為區段),但随着系統使用時間的增加,碎片是難以完全避免的。是以出現了線上碎片整理工具,它們可以對檔案系統和單個檔案執行碎片整理,進而改善性能。線上碎片整理程式是一個簡單的工具,它将檔案複制到引用相鄰區段的新 ext4 inode。

線上碎片整理還可以減少檢查檔案系統所需的時間(

fsck

)。ext4 将未使用的塊組标記到 inode 表中,并讓

fsck

程序忽略它們以加快檢查速度。當作業系統因内部損壞(随着檔案系統變大,這是不可避免的)而檢查檔案系統時,ext4 的設計方式将能夠提高總體可靠性。

結束語

針對 Linux 的擴充檔案系統有着漫長而豐富的曆史 — 從 1992 年首次引入 ext1 到 2008 年引入 ext4。ext4 是首個專門為 Linux 設計的檔案系統,并且事實證明它是高效、穩定、強大的檔案系統。ext4 随着檔案系統研究的深入而不斷發展,并且借鑒其他新檔案系統的先進思想(比如 XFS、JFS、Reiser 和 IRON 容錯檔案系統技術)。盡管目前預測 ext5 将會是什麼樣子還為時過早,但有一點是很明确的,它将主導企業級 Liunx 系統。

  • 您可以參閱本文在 developerWorks 全球網站上的 英文原文。
  • “Ubuntu 9.04 Receives EXT4 Support” 這篇文章在最新的 Ubuntu 發行版中尋找 ext4 的重大性能改進(與 JFS、XFS、ReiserFS 和 Ext3 對比)。
  • 檢視 ext4 kernel wiki(幫助您在自己的系統上運作 ext4)、Fedora ext4 page、Kernel Newbies ext4 page 和 Wikipedia,了解更多關于 ext4 的資訊。您還可以通過 Wikipedia 的 Extended file system 頁面了解所有擴充檔案系統(從 1 到 4),它提供關于檔案系統比較和第 2 個擴充檔案系統的曆史的連結。
  • 通過 IBM Linux Technology Center 上的 “Ext4: The Next Generation of Ext2/3 Filesystem” 檢視關于 ext4 的優秀介紹。
  • 閱讀 Tim 的 “Linux 檔案系統剖析”(developerWorks,2007 年 10 月)和 “Linux 日志檔案系統剖析”(developerWorks,2008 年 6 月),了解更多關于 Linux 檔案系統和日志檔案系統的資訊。
  • 從 Softpedia 了解新釋出的核心 2.6.28:2.6.28,從 Heise 線上了解 2.6.29:2.6.29。新釋出的 2.6.28 和 2.6.29 核心取得了重大的進步。
  • 更多地了解 ext4 的早期曆史。這篇于 2006 年發表的文章介紹了 Theodore Tso 關于未來 ext4 檔案系統的早期建議。
  • 從 University of Wisconsin-Madison 的站點上閱讀 Vijayan Prabhakaran's IRON File Systems dissertation。IRON (Internal RObustNess) 技術假設磁盤以獨特的方式失敗,并提供解決辦法。IRON 尤其建議使用日志記錄進行失敗檢測和恢複。
  • 更多地閱讀 Tim 在 developerWorks 上的文章。
  • 在 developerWorks Linux 專區 尋找為 Linux 開發人員(包括 Linux 新手入門)準備的更多參考資料,查閱我們 最受歡迎的文章和教程。
  • 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。
  • 随時關注 developerWorks 的 技術活動和網絡廣播。 
  • http://zauc.wordpress.com/tag/ext4/(ext4-howto中文)

繼續閱讀