我們在主機上定義了一個 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 設備多得多? 即使這是已經分配給檔案系統重複使用的空間,難道不應該重複使用它而不是分配新空間嗎?
資料由大量小檔案組成,這些小檔案不定期地新增和刪除。
答案1
原因是,當從 zram0 裝置中的 ext4 檔案系統中刪除檔案時,記憶體不會釋放回系統。這意味著,儘管空間可供檔案系統使用( 的輸出df
),但仍分配了記憶體( 中的統計資料/sys/block/zram0
)。結果,記憶體使用率達到了分配的 100%,儘管檔案系統由於刪除仍然發現自己是半滿的。
這確實意味著您仍然可以填充檔案系統,並且新檔案將不會使用那麼多的新記憶體空間;然而,它確實會對壓縮比產生負面影響。
解決方案是使用discard
和noatime
選項掛載檔案系統。釋放discard
將檔案空間釋放回記憶體設備,因此兩者的使用情況再次匹配。