Mac mini M4 當構建節點時,磁碟先滿往往比 CPU 先滿:Xcode DerivedData、模擬器映象、快取的 Pods 與未上傳的中間產物堆在一起,Runner 仍顯示線上但 xcodebuild 以晦澀 I/O 錯誤失敗。本文為 2026 年可執行矩陣:先定水位閾值與告警,再決定「本地刪、遠端存、還是縮短保留」,最後給六步清理與和佇列 SLO 的聯動方式。文內含兩張結構不同的表與多處數值化引數。
佇列與擴縮容背景見 佇列深度與等待 SLO;維護排空見 Runner 排空與交接。需要臨時加機吸收磁碟整理視窗可看 定價與區域;連線問題見 幫助文件。
三類典型痛點:不是「空間不足」四個字能概括的
- DerivedData 與索引爆炸:多分支並行時,單倉可在數週內漲到 40~90 GB,且增量編譯依賴其存在——粗暴全刪會讓下一次構建像冷啟動。
- 產物只落盤不上傳:流水線把
.ipa或測試包留在/tmp,重跑與重試成倍放大。 - 監控只看 CPU:磁碟 95% 時佇列仍接收任務,直到隨機作業失敗才暴露,p95 等待被誤讀為「需要加機」。
磁碟水位閾值與告警動作
| 根卷可用空間佔比 | 建議動作 | 是否可繼續接新作業 |
|---|---|---|
| > 20% | 常規監控 | 是 |
| 12~20% | 觸發 DerivedData 按年齡 LRU 清理 | 是,附公告 |
| < 10% | 從預設標籤摘除主機並排空 | 否,直至恢復 > 15% |
保留策略矩陣:刪、傳、還是縮 TTL
| 資料型別 | 首選 | 次選 | 避免 |
|---|---|---|---|
| 可再生的 DerivedData | 按最後訪問時間刪最舊 30% | 按分支保留白名單 | 無差別 rm -rf ~/Library/Developer |
| 需審計的構建產物 | 上傳物件儲存並設 14 天生命週期 | 同步到只讀 NFS | 長期堆在 Runner 本地 |
| Pods / SPM 快取 | 集中快取伺服器 + 本地上限 15 GB | 按 lock 檔案雜湊分片 | 每 job 全量重新解析不限制體積 |
與 SLO 掛鉤:當磁碟清理導致冷編譯使單作業牆鐘上升超過 25% 時,在週報中單獨披露「儲存治理成本」,避免被誤記為 Runner 效能退化。
模擬器與 XCTest 產物的特殊處理
iOS 模擬器在多次 UI 測試後會留下大量裝置資料與截圖快取,體積常達 20~50 GB。建議在非釋出周設定「模擬器重置日」:先確認無正在執行的 UI 套件,再按裝置型號批次解除安裝未使用 runtime。若團隊依賴快照測試,務必備份黃金快照到物件儲存而非留在 Runner 本地。否則清理指令碼會誤刪基線,導致大規模假陽性。
對 Xcode 的 Archives 目錄,可與釋出工單繫結保留策略:關聯已上架版本的歸檔保留 90 天,未關聯釋出的試驗性歸檔 14 天即回收。把規則寫進內部 wiki 並連結到 CI 模板變數,減少「誰刪了我的包」類工單。
六步有序清理清單
- 基線快照:記錄
df -h與最大目錄duTop 10。 - 摘掉入站標籤:防止清理中途有新作業寫入。
- 刪過期臨時目錄:按工單號或構建號匹配 > 72 h 的目錄。
- 執行 DerivedData LRU:保留預設分支與最近 5 個活躍分支的快取。
- 驗證最小綠構建:跑一條標準流水線含簽名步驟。
- 掛回標籤並觀察 60 分鐘:對比 p95 等待與清理前基線。
自動化清理與人工門禁的平衡
完全自動化清理在凌晨執行省事,但容易在釋出夜誤傷熱快取。折中方案是:自動化只處理明確安全的目錄(臨時構建、超過 TTL 的下載快取),DerivedData 的 LRU 需要白天值班二次確認或在低峰視窗執行。把 cron 與編排器維護窗寫入同一日曆,避免「無人知曉的 rm」與「計劃內排空」疊乘導致佇列真空。
指標上建議同時跟蹤「清理節省的 GB」與「隨後 24 小時內編譯牆鍾中位數」:若節省空間顯著但牆鐘上升超過約定閾值,應回滾策略或擴大白名單分支集合。單一 KPI 只看磁碟百分比會誤導管理層以為運維「修好了」而研發感到「變慢了」。
獨佔物理機與雲節點的組合思路
Apple Silicon M4 的統一記憶體與高速 SSD 適合作為「熱」構建層,但仍需策略防止單盤寫放大。NodeMac 在香港、日本、韓國、新加坡與美國提供帶 SSH 與 VNC 的專用 Mac mini M4,可在主池清理時租用短期溢位機承接流量;按需付費避免為偶發磁碟峰值採購整機。把節點當可替換資源時,磁碟治理與 容量借調、並行構建分片 同一套標籤語言描述,運維認知成本更低。
磁碟告警與容量預測
與其在 95% 滿盤時才人工介入,不如在 75% 與 85% 設兩級告警:前者觸發「本週清理 backlog」工單,後者觸發「禁止新大任務入隊」的軟閘門。結合近 14 天構建次數與平均產物大小做線性外推,可提前 48 小時預測是否會撞線。
APFS 快照與 Time Machine 本地備份在 CI 機上常是隱形佔用源。若未使用,應在基線映象中預設關閉;若需要,給快照單獨配額並在週報告裡列出 top 目錄,避免「系統資料」黑盒化。NodeMac 客戶在獨佔機上可要求運維在交付清單寫明初始快照策略,減少首月踩坑。
常見反模式
無差別 rm -rf ~/Library/Developer/Xcode/DerivedData 會在高峰時段拖垮編譯;把 CocoaPods 與 SwiftPM 快取與構建產物混在同一卷卻不設上限,會導致「刪了 DerivedData 仍滿盤」的假勝利;僅依賴雲廠商磁碟擴容而不改保留矩陣,成本會線性上升而問題復發週期不變。
將本矩陣列印成一頁紙貼在值班手冊首頁,並在季度回顧會上用真實節省的 GB 與構建耗時資料覆盤,比口頭強調「記得清盤」有效得多。與 佇列等待 SLO 與 Runner 排空 聯動時,可把磁碟軟閘門作為編排器前置條件,形成閉環。