Zfs

如何防止 ntfs-3g 使我的 ZFS ARC 記憶體不足?

  • May 31, 2020

我有一個基於 Debian GNU/Linux 7 (wheezy)執行OpenMediaVault 2.1.18 (Stone burner) 的 HP Microserver。

幾天前,我需要從 USB 驅動器中複製大量文件,使用 NTFS 格式化。我連接它,安裝它並開始複製並讓它完成。

一天后,我發現它幾乎沒有複製任何東西,而且我的 NAS 性能下降了。經過調查,我發現頁面和緩衝區記憶體現在佔用了超過 3/4 的系統記憶體(這些通常佔用不到 10%),並且 ZFS ARC 現在被擠壓到剩餘記憶體中(小於正常大小的 1/4 )。

當我意識到出了什麼問題時,我停止了複製,解除安裝並拔掉了驅動器,記憶體很快恢復到正常大小,然後 ARC 開始自行填充到正常水平。

那麼,如果我以後需要做更多的直接複製,我該如何防止掛載 ntfs 驅動器導致消耗大量記憶體,從而使我的 ZFS ARC 缺乏所需的記憶體?


注意:我嘗試執行(根據shodanshok建議echo 3 > /proc/sys/vm/drop_caches“釋放頁面記憶體、dentries 和 inode” man 5 proc),但這也刷新了我的 ARC(記憶體 L2ARC 標頭所需的記憶體除外)。因此,我的系統有大量可用記憶體,但由於內容僅記憶體在 ARC 或 L2ARC 中,因此我的系統花了很長時間來調整驅動器以重新填充 ARC,這不是理想的狀態。


在這張圖片中,您可以看到在 5 日開始時 ZFS 飢餓,當我開始我的 ntfs 副本時,在 6 日早些時候解除安裝 ntfs 驅動器時一切恢復正常,然後最後 ARC 被清除(並重建) 7日下午使用drop_caches。

ARC飢餓

最簡單的解決方案是定期刷新緩衝區和頁面記憶體記憶體。您可以輕鬆地在後台(或另一個 tty)執行類似的 bash 行:

while true; do echo 1 > /proc/sys/vm/drop_caches; sleep 5; done

或者,您可以嘗試不同的方法來避免污染緩衝區/頁面記憶體。基本上,您需要使用 DIRECT_IO 複製每個文件,完全繞過頁面記憶體。您可以使用類似於以下的命令來執行此操作:

dd if=srcfile of=dstfile bs=1M iflag=direct

上述命令的作用是使用 O_DIRECT 選項打開 srcfile,在讀取期間繞過頁面記憶體,但在寫入期間不繞過。如果您甚至需要繞過寫入記憶體,則可以附加一個oflag=direct選項。

上述解決方案的真正問題是,必須一個一個地指定一個文件,執行多個(可能是數千個)。這意味著您必須編寫腳本dd,以便您可以複製整個目錄 3.

其他選項包括:

  • 使用ddrescue而不是dd
  • cp首次載入時使用簡單的(有關詳細資訊,libdirectio請參見此處)

最後,您可以嘗試執行您的 NTFS 應用程序/複製systemd-run並設置特定的記憶體約束,這也適用於限制頁面記憶體。

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