
我正在配置一台運行 3 個 ZFS 池的伺服器,其中 2 個池是特定用途的,我覺得預設建議根本沒有針對它們進行最佳化。雙 10gbit 適配器促進網路連線。
池1是一個大文件存儲,它包含很少寫入和讀取的原始視頻數據,以及偶爾的備份。快取該池中的任何內容絕對沒有意義,因為它是從頭到尾一次掃描讀取的高頻寬數據,快取其中的任何內容將完全浪費記憶體。延遲並不是什麼大問題,而且由於資料高度可壓縮,頻寬也很充足。該池由 8 個 z2 模式的 HDD 組成,可用容量為 24TB。
池2是壓縮視訊幀儲存。在合成影片專案時會經常閱讀此內容的部分內容。經常使用的資料部分通常高於伺服器的RAM總量,有低延遲要求,但不是超低,頻寬更重要。該池由 z1 中的 3 個 HDD 組成,可用容量為 8TB,以及一個用於 L2ARC 的 1TB NVME SSD。
池 3 是通用存儲,用作多個計算機系統的存儲,這些計算機系統從其中啟動並運行軟體,而不是本地存儲。由於它必須為多台機器和主系統儲存提供服務,因此這裡對延遲和頻寬的要求最高。此池主要用於讀取,寫入僅限於客戶端系統的操作。該池由 3 個 z1 模式的 SATA SSD 組成,可用容量為 1TB。
我的最佳化意圖是最小化前兩個池的 ARC 大小,以便最大化第三個池的 ARC 大小。
池 1 從快取中沒有任何好處,那麼我可以為其設定的最小 ARC 安全量是多少?
池 2 可以從 ARC 中受益,但實際上並不值得,因為 L2ARC 的速度足以滿足此目的,並且驅動器具有 1 TB 容量。理想情況下,如果我能夠在該卷中不使用任何 ARC 並使用完整 TB 的 L2ARC,我會很高興,但似乎 L2ARC 標頭數據至少需要一些 ARC。
因此,考慮到 1 TB 的 L2ARC 容量和 64k 的池記錄大小,1tb / 64kb * 70b 給我約 0.995gb。這是否意味著我可以安全地將該池的 ARC 上限限制為 1GB?或者也許還需要更多?
看來 ARC 既包含讀取緩存,也包含處理 L2ARC 的信息,所以看起來我需要的是一些選項來強調管理更大的 L2ARC,而不是費心在 RAM 中緩存實際數據。如有必要,如果快取逐出策略不遵守通常的快取層次結構策略,則強制將 ARC 中的任何快取逐出移至 L2ARC。
我讀過的一般建議建議每 1TB 儲存約 1GB RAM,我計劃每 33TB 儲存 32GB RAM,我幾乎完全同意,但 L2ARC 與 ARC 是 4 或 5 比 1,我達不到這一點相當多。目標是將池 1 ARC 削減得盡可能低,並將池 2 ARC 削減到所需數量,以便能夠利用整個 1TB 的 L2ARC,從而最大化池 3 的 ARC 可用的 RAM 。
答案1
首先,我真的建議您重新考慮池 n.2 和 n.3 的佈局:3 路鏡像不會為您提供低延遲,也不會為您提供高頻寬。我不會使用昂貴的1 TB NVMe 磁碟用於L2ARC(順便說一句,由於32 GB ARC 較小,所以不平衡),我會以RAID10 方式使用更多7200 RPM 磁碟,甚至更便宜但可靠的SSD(例如:三星850) Pro/Evo 或 Crucial MX500)。
至少,您可以將所有磁碟放在單一 RAID10 池上(使用 SSD L2ARC),並透過多個資料集對單一池進行分段。
primarycache
也就是說,您可以使用和選項指定如何在逐個資料集的基礎上使用 ARC/L2ARC secondarycache
:
zfs set primarycache=none <dataset1> ; zfs set secondarycache=none <dataset1>
將禁用任何資料集的 ARC/L2ARC 快取。您也可以zfs set logbias=throughput <dataset1>
在寫入作業期間授予吞吐量特權而不是延遲;zfs set primarycache=metadata <dataset2>
將為第二個資料集啟用僅元資料快取。請注意,L2ARC 由 ARC 提供;這意味著如果 ARC 僅緩存元數據,L2ARC 也是如此;- 為第三個資料集保留 ARC/L2ARC 預設選項。
最後,您可以將 ZFS 實例設定為將超過(預設)50% 的 RAM 用於 ARC(zfs_arc_max
在模組手冊頁)