為了進行測試,我需要 zfs 的快取處於冷狀態。
我可以透過刪除快取磁碟、匯出和匯入池來刷新池中的快取。這給了我想要的效果。但真的不想導出池子。
有沒有更簡單的方法來達到相同的效果?
我正在尋找的是相當於:
echo 3 > /proc/sys/vm/drop_caches
這滿足了我對 ext4 的需求。
背景
我可以用不同的方式運行我的演算法。我不關心最好情況下的性能。我做關心最壞情況下的性能。最糟的情況是冷數據(很久以前接觸過的數據,不再存在於 ARC/L2ARC 中)。
為了選擇運行演算法的最佳方式,我需要能夠在相同的測試集上運行。而且這個測試集必須是冷的。這完全違背了 ZFS 的快取策略:如果我一次又一次地在同一個測試集上運行,它會將資料放入 ARC 中 - 這在正常情況下是完全有意義的,但在這裡不是。
我可以在我的開發計算機上匯出/匯入,但無法在生產中執行此操作。但是,刷新快取將要生產中可以接受。
我更喜歡 ARC 仍然有效,因此冷資料在讀取後會被快取(再次類似於 ext4),但我可以在測試期間完全停用 ARC。
答案1
echo 3 > /proc/sys/vm/drop_caches
用過的清除 ZFS 緩存,但最近的一些提交將其更改為僅部分清除它。
若要恢復舊的行為,必須將zfs_arc_shrinker_limit
模組參數設為0
(請參閱這裡)。
因此,要刪除 ARC 而不匯出池:
echo 0 > /sys/module/zfs/parameters/zfs_arc_shrinker_limit
echo 3 > /proc/sys/vm/drop_caches
上面的會掉幾乎所有 ZFS ARC,只留下少量與基本池元資料相關的 MB。