ZFS ARC 調校:上限、限制與應監測的指標

11 分鐘閱讀 - 2026年6月24日

hero section cover
目錄
  • 在進行任何調校前,請先測量 ARC
  • 四項關鍵的 ARC 可調參數
  • 根據工作負載調整 ARC
  • 診斷問題與知曉何時停止
分享

根據工作負載進行 ZFS ARC 調校。哪些可調參數至關重要、如何在 Linux 和 FreeBSD 上設定 zfs_arc_max,以及如何判斷調校是否完成。

ZFS 預設會默默佔用系統約一半的 RAM 作為讀取快取;若在不合適的伺服器上運行,這將導致交換區活動、OOM 強制終止,或是資料庫與檔案系統爭奪記憶體資源。ZFS ARC 調校的重點在於決定 ARC 實際可保留多少 RAM,以及為了設定此限制而必須放棄哪些資源。 本文將探討 ARC 如何使用記憶體、在進行任何調整前應先測量的項目、值得變更的幾項可調參數,以及針對檔案伺服器、虛擬化平台、資料庫和備份目標的合理起始設定。關於 ZFS 的快照功能,請參閱我們的 ZFS 快照指南

在進行任何調校前,請先測量 ARC

在取得正常繁忙時段的基準數值之前,請勿變更任何可調參數。在非繁忙時段擷取的快照會引導您走向錯誤的方向。夜間備份、每週報告和批次工作通常是 ARC 行為表現出特殊情況的時段,因此請擷取數天的數據。

以下三項工具可滿足您的大部分需求:

  • arcstat 1 可即時滾動顯示命中與未命中計數器、需求與預取活動,以及當前 ARC 大小。請於負載測試及備份時段使用此工具。
  • arc_summary 可輸出單一快照:包含 ARC 大小與目標值、MFU/MRU 比例、元資料比率,以及當前可調參數。執行 arc_summary -s arc 此指令僅顯示 ARC 相關部分。
  • 原始計數器位於 /proc/spl/kstat/zfs/arcstats ,並位於 kstat.zfs.miscvfs.zfs sysctl 樹中。請從監控系統中擷取這些資料,而非解析格式化的輸出。

在進行任何變更前值得記錄的計數器:

指標位於何處為何重要
ARC 大小、目標值、最大值 (size, c, c_max)arcstat, kstat可讓您了解 ARC 是否已達上限,或是仍有擴充空間
需求資料與元資料命中率arcstat, arc_summary需求未滿足會直接導致應用程式延遲
可用記憶體與交換活動 (si/so)free -h, vmstat 1當 ARC 規模龐大時,持續的換入/換出活動是記憶體壓力的最明顯徵兆
磁碟服務時間(await)與利用率iostat -x將 ARC 未命中與實際儲存瓶頸建立關聯
memory_throttle_count/proc/spl/kstat/zfs/arcstats計數值上升確認 ZFS 正因記憶體壓力而受到限速

此處有兩點常見誤解。請關注「可用記憶體」,而非「閒置記憶體」;Linux 會將低閒置 RAM 視為穩定狀態並樂於報告,但僅此一點本身並非問題。 真正需要關注的訊號是「可用記憶體」接近零,同時伴隨持續的交換活動(《Linux 記憶體管理入門》一文中已說明原因)。此外,應將命中率視為趨勢,而非目標。若系統正在進行交換,即使命中率達到 99%,也代表調校失敗,而非成功。


 

四項關鍵的 ARC 可調參數

大多數生產環境的調校最終都歸結於這四項設定。請根據基準測試中實際測得的壓力來調整設定。切換活動的重點在於 zfs_arc_max。若熱快取不斷被清除,則表示需回收流失流量,這指向 zfs_arc_min。目錄遍歷速度過慢則指向元資料限制。

可調參數功能說明何時應調整設定錯誤的風險
zfs_arc_maxARC RAM 使用量的硬性上限共同託管需要預留 RAM 的資料庫或虛擬機器設定過低:會增加磁碟 I/O 及延遲。設定過高:可能導致交換壓力或 OOM。
zfs_arc_min防止 ARC 過度縮減的下限工作負載會產生短暫的記憶體尖峰,導致快取不斷被清除過高:在真正面臨記憶體壓力時會導致應用程式資源匱乏
zfs_arc_meta_limit_percent可供元資料使用的 ARC 比例(取代舊版 zfs_arc_meta_limit)數百萬個小檔案、深層目錄樹、緩慢 ls/find過低:目錄查詢速度極慢;過高:導致資料快取資源不足。
zfs_arc_free_targetZFS 試圖保留多少可用系統記憶體會出現突發性大量記憶體分配的伺服器(虛擬機器啟動、大型查詢計畫)過高:即使有可用 RAM,ARC 仍保持較小規模

請從能解決您所觀察到的壓力問題的最小調整開始著手。至於 zfs_arc_max,適當的上限取決於工作負載(詳見下一節)。至於 zfs_arc_min,若確實需要設定下限,將 zfs_arc_max ,這是一個合理的起點(若確實需要設定下限的話)。至於元資料,最新的 OpenZFS 預設值已透過 zfs_arc_meta_limit_percent,這對大多數工作負載而言已相當寬裕;僅當在 arcstat.

在 Linux 和 FreeBSD 上套用變更

在 Linux 上,可透過寫入 sysfs 參數檔案來於執行時測試變更。無需重新開機:

echo 17179869184 > /sys/module/zfs/parameters/zfs_arc_max

這會將 zfs_arc_max 立即將其設定為 16 GiB。若要讓變更在重新開機後仍有效,請將其加入 /etc/modprobe.d/zfs.conf:

options zfs zfs_arc_max=17179869184

在 FreeBSD 上,執行時變更使用 sysctl:

sysctl vfs.zfs.arc_max=17179869184

若要讓該值在重啟後持續生效,請將其加入在 FreeBSD 上,執行時變更需使用 /boot/loader.conf:

vfs.zfs.arc_max="17179869184"

每次僅調整一項設定,且調整幅度應控制在總記憶體的 10% 左右。密切觀察問題視窗。僅當交換空間維持為零且延遲值穩定時,才保留該變更。僅在運行時測試通過後才將設定永久保存。

根據工作負載調整 ARC

總記憶體容量並非最佳的起點。ARC 的配置應依據系統上的工作負載組合來決定。

工作負載啟動 zfs_arc_maxARC 優先級備註關鍵指標
專用檔案伺服器/NAS75% 至 80% 的 RAM資料與元資料啟用預取功能。關鍵在於採用積極的快取策略。整體命中率
虛擬化主機30% 至 40% 的 RAM平衡為虛擬機器記憶體及主機任務預留空間。任何非零 si/so 值,則需進一步限制上限。主機交換空間 (si/so)
資料庫伺服器RAM 的 25% 至 50%以元資料為主的請先為資料庫引擎預留記憶體。若 primarycache=metadata 若引擎自行處理其緩衝區快取。需求缺失
備份/歸檔目標保守上限僅元資料設定 primarycache=metadata 因此,單次掃描不會將有用的區塊移出。預取未命中、元資料命中率
分析/重複讀取在預留其他快取空間後,上限更高MFU 密集型NVMe 上的 L2ARC 可在多次查詢執行期間保留熱工作集。需求缺失

虛擬機器主機需要與其客機共享記憶體,因此 30% 至 40% 的上限是安全的預設值,而在大多數建置環境中,50% 已經過高。像 PostgreSQLMySQL 這樣的資料庫會自行管理其緩衝區快取,因此應優先為引擎預留記憶體,並讓 ARC 使用剩餘的空間。 備份目標可從中受益 primarycache=metadata ,因為被讀取的資料極少會再次被需要,且您不希望夜間備份在遍歷整個記憶體池的同時,將其餘快取內容一併清空。在所有工作負載中,當 ARC 被固定在 zfs_arc_max 時,換片活動即表示上限設定過高;這項規則不會改變。

診斷問題與知曉何時停止

ARC 容量不足時,會表現為讀取 IOPS 過高、需求命中率偏低,以及目錄瀏覽速度緩慢,而系統仍擁有閒置 RAM。ARC 容量過大則較不顯著。命中率看似正常,但系統開始進行交換,負載平均值攀升,程序會阻塞在 D 狀態中阻塞,而最糟的情況下,OOM 殺手會開始篩選犧牲者。快取看似正常,但伺服器的運作狀況卻極為糟糕。

demand_metadata_bytes 遠高於 demand_data_bytesarc_summary。此時表示元資料正與資料爭奪空間,值得提高元資料百分比上限。

根據您觀察到的現象,首先應檢查以下設定:

症狀可能原因首先應檢查的調整參數下一步
await 伴隨高需求缺失工作集超過 ARCzfs_arc_max增加 RAM 或增加 L2ARC
當 ARC 較大時會發生交換活動ARC 導致作業系統或應用程式資源不足zfs_arc_max降低上限
記憶體突增後效能驟降回收期間進行激進的驅逐zfs_arc_min將下限設定為 arc_max
ls, find、小檔案操作元資料快取飢餓zfs_arc_meta_limit_percent提高元資料佔比
上升中 memory_throttle_count全系統記憶體壓力zfs_arc_max降低上限;檢查 L2ARC 索引是否膨脹

L2ARC 並非免費資源。L2ARC 項目的索引存於主 ARC 中,若其開銷攀升至總 ARC 容量的三分之一左右,次級快取將弊大於利。 僅當工作集大於 RAM 容量,但仍可容納於高速 NVMe 裝置中,且主 ARC 的命中率已處於健康狀態時,才應啟用 L2ARC。

停止調校的適當時機是:延遲值趨於平穩、在引發原始問題的相同繁忙時段內換入量維持為零,且進一步調整已無法帶來任何改善。若伺服器仍在進行換入,即使命中率很高也毫無意義。超過這個點後,請停止調整設定,僅在相同工作負載下問題再次出現時才重新檢視這些設定。

若您需要一台具備足夠 RAM 餘裕的伺服器,以確保 ZFS 能正常運作,且無需與虛擬機器或資料庫爭奪記憶體(關於實際需要多少 RAM,建議先閱讀相關文章),不妨考慮 FDC 的專用伺服器

博客

本周特色

更多文章
數位視力疲勞:在螢幕使用頻繁的時代,如何保護您的視力

數位視力疲勞:在螢幕使用頻繁的時代,如何保護您的視力

整天盯著螢幕看嗎?學習如何運用經過驗證的技巧與工具來減輕數位眼疲勞。這份指南對於遠距工作者、開發人員以及所有科技從業者而言都不可或缺。

4 分鐘閱讀 - 2025年5月21日

為何擁有強大且不限流量的 VPS 至關重要

8 分鐘閱讀 - 2025年5月9日

更多文章