zram 檔案系統會報告設備層級的使用情況與檔案系統所報告的情況不同

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 設備多得多? 即使這是已經分配給檔案系統重複使用的空間,難道不應該重複使用它而不是分配新空間嗎?

資料由大量小檔案組成,這些小檔案不定期地新增和刪除。

答案1

原因是,當從 zram0 裝置中的 ext4 檔案系統中刪除檔案時,記憶體不會釋放回系統。這意味著,儘管空間可供檔案系統使用( 的輸出df),但仍分配了記憶體( 中的統計資料/sys/block/zram0)。結果,記憶體使用率達到了分配的 100%,儘管檔案系統由於刪除仍然發現自己是半滿的。

這確實意味著您仍然可以填充檔案系統,並且新檔案將不會使用那麼多的新記憶體空間;然而,它確實會對壓縮比產生負面影響。

解決方案是使用discardnoatime選項掛載檔案系統。釋放discard將檔案空間釋放回記憶體設備,因此兩者的使用情況再次匹配。

相關內容