Linux

為什麼我的 XFS 文件系統突然佔用更多空間並充滿稀疏文件?

  • May 24, 2019

近 10 年來,我在各種 Linux 伺服器上將 XFS 文件系統作為數據/增長分區執行。

我注意到最近執行版本 6.2+ 的 CentOS/RHEL 伺服器有一個奇怪的現象。

從 EL6.0 和 EL6.1 遷移到較新的作業系統版本後,穩定的文件系統使用變得高度可變。最初安裝 EL6.2+ 的系統表現出相同的行為;顯示 XFS 分區上磁碟使用率的劇烈波動(請參見下圖中的線)。

之前和之後。從 6.1 升級到 6.2 發生在周六。 xfs 圖

同一系統上個季度的磁碟使用率圖表,顯示了上週的波動。 在此處輸入圖像描述

我開始檢查文件系統中是否存在大文件和失控程序(可能是日誌文件?)。我發現我最大的文件報告了來自du和的不同值lsdu使用和不使用--apparent-size開關執行說明了差異。

# du -skh SOD0005.TXT
29G     SOD0005.TXT

# du -skh --apparent-size SOD0005.TXT
21G     SOD0005.TXT

使用ncdu 實用程序對整個文件系統進行快速檢查,結果如下:

Total disk usage: 436.8GiB  Apparent size: 365.2GiB  Items: 863258

文件系統充滿了稀疏文件,與之前版本的作業系統/核心相比,損失了近 70GB 的空間!

我仔細研究了Red Hat Bugzilla和更改日誌,以查看是否有任何關於相同行為的報告或有關 XFS 的新公告。

任何事物。

我在升級過程中從核心版本2.6.32-131.17.1.el6升級到2.6.32-220.23.1.el6;次要版本號沒有變化。

filefrag我用該工具檢查了文件碎片。XFS 分區上的一些最大文件有數千個擴展區。xfs_fsr -v在活動緩慢期間執行線上碎片整理有助於暫時減少磁碟使用量(請參見上面第一張圖中的星期三)。但是,一旦恢復繁重的系統活動,使用量就會激增。

這裡發生了什麼?

我將此問題追溯到2010 年 12 月關於XFS 原始碼樹送出的討論。該更新檔是在核心 2.6.38 中引入的(很明顯,後來被反向移植到一些流行的 Linux 發行版核心中)。

觀察到的磁碟使用波動是新功能的結果;XFS 動態推測 EOF 預分配

這是通過在文件大小增加時推測性地分配空間來減少流式寫入期間的文件碎片的舉措。每個文件預分配的空間量是動態的,主要是文件系統上可用空間的函式(以防止完全耗盡空間)。

它遵循以下時間表:

freespace       max prealloc size
 >5%             full extent (8GB)
 4-5%             2GB (8GB >> 2)
 3-4%             1GB (8GB >> 3)
 2-3%           512MB (8GB >> 4)
 1-2%           256MB (8GB >> 5)
 <1%            128MB (8GB >> 6)

這是對文件系統的一個有趣的補充,因為它可能有助於我處理一些大量碎片化的文件。

額外的空間可以通過釋放 pagecache、dentries 和 inode 來臨時回收:

sync; echo 3 > /proc/sys/vm/drop_caches

allocsize通過在文件系統掛載期間定義一個值,可以完全禁用該功能。XFS 的預設值為allocsize=64k.

監控/門檻值系統可能會感受到這種變化的影響(這就是我發現它的方式),但也影響了數據庫系統,並可能導致精簡配置的虛擬機和儲存陣列(他們將使用比您預期的更多空間)。

總而言之,這讓我措手不及,因為在分發級別甚至在監視XFS 郵件列表時都沒有明確宣布文件系統更改。


編輯
具有此功能的 XFS 卷的性能得到顯著提高。我看到以前顯示高達 50% 碎片的捲上的碎片始終小於 1%。寫入性能在全球範圍內上升!

來自同一數據集的統計數據,將舊版 XFS 與 EL6.3 中的版本進行比較。

老的:

# xfs_db -r -c frag /dev/cciss/c0d0p9
actual 1874760, ideal 1256876, fragmentation factor 32.96%

新的:

# xfs_db -r -c frag /dev/sdb1
actual 1201423, ideal 1190967, fragmentation factor 0.87%

引用自:https://serverfault.com/questions/406069