zram 文件系統在設備級別報告的使用情況與文件系統報告的不同
我們在我們的主機上定義了一個 80GB 的 zram 設備,其中有一個 170GB 的 ext4 文件系統:
echo 170G > /sys/block/zram0/disksize echo 80G > /sys/block/zram0/mem_limit /usr/sbin/mkfs.ext4 -q -m 0 /dev/zram0 /usr/bin/mount /dev/zram0 /var/zram
我們的應用程序使用這個文件系統來快速訪問大量的臨時數據。
顯示的文件系統大小
df
與報告的 zram 大小相匹配/sys/block/zram0/disksize
將測試數據複製到一個空的文件系統中,我們驗證了 2.2 : 1 的壓縮比,因此文件系統在我們達到 zramfs 記憶體限制之前就被填滿了。該
/sys/block/zram0/orig_data_size
值與文件系統報告的使用情況相匹配:# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0 112779188 Filesystem 1K-blocks Used Available Use% Mounted on /dev/zram0 175329308 112956600 62356324 65% /var/zram
但是,當應用程序在較長時間內使用實時數據執行時,我們發現這不再匹配。
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0 173130200 Filesystem 1K-blocks Used Available Use% Mounted on /dev/zram0 175329308 112999496 62313428 65% /var/zram
現在,文件系統報告使用了大約 110GB,但 zramfs 設備報告了 165GB。同時,zramfs 記憶體耗盡,文件系統變為只讀。
zram 數據證實我們在 orig_data_size 和 compr_data_size 之間獲得了 2.2:1 的壓縮比;但是,為什麼文件系統顯示的可用空間比 zram 設備多得多? 即使這是已經分配給文件系統重用的空間,難道不應該重用它而不是分配新空間嗎?
數據由大量不定期添加和刪除的小文件組成。
造成這種情況的原因是,當從 zram0 設備中的 ext4 文件系統中刪除文件時,記憶體沒有釋放回系統。這意味著,儘管空間可供文件系統使用(的輸出
df
),但仍然分配了記憶體(中的統計資訊/sys/block/zram0
)。結果,記憶體使用率達到了分配的 100%,儘管文件系統仍然發現自己由於刪除而半滿。這確實意味著您仍然可以填充文件系統,並且新文件不會使用太多的新記憶體空間;但是它確實會對壓縮比產生負面影響。
discard
解決方案是使用和noatime
選項掛載文件系統。這些discard
版本將文件空間釋放回記憶體設備,因此兩者的使用再次匹配。