ZFS ARC 調校:上限、限制與應監測的指標
11 分鐘閱讀 - 2026年6月24日

根據工作負載進行 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.misc及vfs.zfssysctl 樹中。請從監控系統中擷取這些資料,而非解析格式化的輸出。
在進行任何變更前值得記錄的計數器:
| 指標 | 位於何處 | 為何重要 |
|---|---|---|
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_max | ARC RAM 使用量的硬性上限 | 共同託管需要預留 RAM 的資料庫或虛擬機器 | 設定過低:會增加磁碟 I/O 及延遲。設定過高:可能導致交換壓力或 OOM。 |
zfs_arc_min | 防止 ARC 過度縮減的下限 | 工作負載會產生短暫的記憶體尖峰,導致快取不斷被清除 | 過高:在真正面臨記憶體壓力時會導致應用程式資源匱乏 |
zfs_arc_meta_limit_percent | 可供元資料使用的 ARC 比例(取代舊版 zfs_arc_meta_limit) | 數百萬個小檔案、深層目錄樹、緩慢 ls/find | 過低:目錄查詢速度極慢;過高:導致資料快取資源不足。 |
zfs_arc_free_target | ZFS 試圖保留多少可用系統記憶體 | 會出現突發性大量記憶體分配的伺服器(虛擬機器啟動、大型查詢計畫) | 過高:即使有可用 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_max | ARC 優先級 | 備註 | 關鍵指標 |
|---|---|---|---|---|
| 專用檔案伺服器/NAS | 75% 至 80% 的 RAM | 資料與元資料 | 啟用預取功能。關鍵在於採用積極的快取策略。 | 整體命中率 |
| 虛擬化主機 | 30% 至 40% 的 RAM | 平衡 | 為虛擬機器記憶體及主機任務預留空間。任何非零 si/so 值,則需進一步限制上限。 | 主機交換空間 (si/so) |
| 資料庫伺服器 | RAM 的 25% 至 50% | 以元資料為主的 | 請先為資料庫引擎預留記憶體。若 primarycache=metadata 若引擎自行處理其緩衝區快取。 | 需求缺失 |
| 備份/歸檔目標 | 保守上限 | 僅元資料 | 設定 primarycache=metadata 因此,單次掃描不會將有用的區塊移出。 | 預取未命中、元資料命中率 |
| 分析/重複讀取 | 在預留其他快取空間後,上限更高 | MFU 密集型 | NVMe 上的 L2ARC 可在多次查詢執行期間保留熱工作集。 | 需求缺失 |
虛擬機器主機需要與其客機共享記憶體,因此 30% 至 40% 的上限是安全的預設值,而在大多數建置環境中,50% 已經過高。像 PostgreSQL 和 MySQL 這樣的資料庫會自行管理其緩衝區快取,因此應優先為引擎預留記憶體,並讓 ARC 使用剩餘的空間。 備份目標可從中受益 primarycache=metadata ,因為被讀取的資料極少會再次被需要,且您不希望夜間備份在遍歷整個記憶體池的同時,將其餘快取內容一併清空。在所有工作負載中,當 ARC 被固定在 zfs_arc_max 時,換片活動即表示上限設定過高;這項規則不會改變。
診斷問題與知曉何時停止
ARC 容量不足時,會表現為讀取 IOPS 過高、需求命中率偏低,以及目錄瀏覽速度緩慢,而系統仍擁有閒置 RAM。ARC 容量過大則較不顯著。命中率看似正常,但系統開始進行交換,負載平均值攀升,程序會阻塞在 D 狀態中阻塞,而最糟的情況下,OOM 殺手會開始篩選犧牲者。快取看似正常,但伺服器的運作狀況卻極為糟糕。
當 demand_metadata_bytes 遠高於 demand_data_bytes 在 arc_summary。此時表示元資料正與資料爭奪空間,值得提高元資料百分比上限。
根據您觀察到的現象,首先應檢查以下設定:
| 症狀 | 可能原因 | 首先應檢查的調整參數 | 下一步 |
|---|---|---|---|
高 await 伴隨高需求缺失 | 工作集超過 ARC | zfs_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日