塊和inode分配策略

ext4(無論如何,比ext3更好)認識到資料區域性性通常是檔案系統的一個理想特性。在旋轉磁碟上,將相關塊彼此靠近可以減少磁頭致動器和磁碟為訪問資料塊而必須執行的移動量,從而加快磁碟I/O。在SSD上當然沒有移動部件,但區域性性可以增加每個傳輸請求的大小,同時減少請求的總數。這種區域性性還可能導致寫入集中在單個擦除塊上,從而顯著加快檔案重寫速度。因此,儘可能減少碎片是有益的。

ext4 用於對抗碎片的第一個工具是多塊分配器。當檔案首次建立時,塊分配器會推測性地為檔案分配 8KiB 的磁碟空間,假設該空間很快就會被寫入。當檔案關閉時,未使用的推測性分配當然會被釋放,但如果推測正確(通常適用於小檔案的完整寫入),那麼檔案資料將以單個多塊範圍的形式寫入。ext4 使用的第二個相關技巧是延遲分配。在這種方案下,當檔案需要更多塊來吸收檔案寫入時,檔案系統會推遲決定磁碟上的確切位置,直到所有髒緩衝區都被寫入磁碟。透過不到絕對必要時(達到提交超時,或呼叫 sync(),或核心記憶體不足時)才確定特定位置,希望檔案系統能夠做出更好的位置決策。

ext4(和ext3)使用的第三個技巧是,它試圖將檔案的資料塊與其inode儲存在同一個塊組中。這減少了檔案系統在首次讀取檔案的inode以瞭解檔案資料塊所在位置,然後定址到檔案資料塊開始I/O操作時的尋道開銷。

第四個技巧是,在可行的情況下,目錄中的所有inode都與其目錄本身放在同一個塊組中。這裡的工作假設是目錄中的所有檔案可能彼此相關,因此將它們放在一起是有用的。

第五個技巧是,磁碟卷被劃分為128MB的塊組;這些迷你容器如上所述用於嘗試維護資料區域性性。然而,存在一個刻意的怪異之處——當在根目錄中建立目錄時,inode分配器會掃描塊組,並將該目錄放入它能找到的負載最輕的塊組中。這鼓勵目錄分散到整個磁碟上;當頂層目錄/檔案塊填滿一個塊組時,分配器會簡單地移到下一個塊組。據稱這種方案可以平衡塊組的負載,儘管作者懷疑那些不幸地落在旋轉驅動器末尾的目錄在效能方面會受到不公平待遇。

當然,如果所有這些機制都失敗了,人們總可以使用 e4defrag 來碎片整理檔案。