ZFS 的 ARC 計數器是否持久?

ZFS 的 ARC 計數器是否持久?

假設我有一些經常訪問的數據和一些不經常訪問的數據。據我所知,ARC 最終將學會停止驅逐經常訪問的數據,以便為其他數據騰出空間,因為其他數據最近被訪問過。假設我已經運行 ZFS 系統相當長一段時間並且它已經採用了這種存取模式。

如果我重新啟動我的盒子並且經常訪問的資料只是被讀取,因此在 ARC 中,其他資料的新讀取是否會導致其被驅逐?或者 ZFS 是否記得該數據被頻繁使​​用?

如果它依賴實現,那麼這個問題特別適合 Solaris。

答案1

ARC 沒有任何持久計數器,因此它必須再次查看您的存取模式才能確定某些內容已頻繁使用。然而,它不會驅逐任何東西,直到它已滿/系統上其他東西有內存壓力,所以在第一次啟動時一切讀取或寫入的內容最終將進入快取。只要您經常訪問的資料在此之前被讀取兩次,它就應該進入“MFU”列表。

您可以閱讀有關 ARC 演算法的更多信息這裡。簡而言之,它實際上是由兩個LRU 列表組成,一個用於已訪問過一次的內容(“MRU 列表”),另一個用於已訪問過兩次或以上的內容(“MFU 列表” ——是的,名稱不正確,它確實使用 LRU 進行驅逐,因為 LRU 比 MFU 更快、更簡單實現)。還有“幽靈列表”,用於追蹤每個列表中最近逐出的鍵(但不是數據),這有助於確定兩個快取相對應有多大。

L2ARC 是持久性的(通常儲存在 SSD 上),但不使用 ARC 演算法(又是一個次優名稱)。我相信它只是對快取中的資料進行循環。另外,我相信你不能在重新啟動後重複使用它,除非你使用 Nexenta 的 OpenZFS 分支(我認為他們還沒有將其引入上游)。

除了 Nexenta 的「持久 L2ARC」功能外,這個答案中沒有任何內容是特定於平台的。

相關內容