企業資源池裡,同一台 Mac CI Worker 常同時跑 Gradle/Bazel 與 xcodebuild:metadata 與小檔寫入會和遠端構建快取的大塊讀取搶同一條 NVMe 佇列,CPU 尚未打滿尾延遲已惡化。請先把 repository_cache、disk_cache、Gradle 家目錄與每 Job 的 DerivedData 拆到獨立卷或至少獨立頂層目錄,再談命中率與成本。與 Xcode 26 編譯快取、gRPC 分層可互相參照 Xcode 26 編譯快取與 gRPC/NVMe FAQ;Test Plan、worker 與模擬器記憶體 與本題並行度疊加時見 Xcode 並行測試與磁碟水位 FAQ。
一、Bazel:repository_cache 與 disk_cache 為何要分區
repository_cache 承接跨 workspace 的外部依賴 blob,讀多、單檔偏大;disk_cache 堆積 action 輸出與大量小檔指紋,寫入與列目錄更密。兩者擠在同一 APFS 卷時,常見「命中數字尚可、await 卻飆高」的尾延遲。落地至少兩掛載點(兩卷更佳):對 disk_cache 做配額+週期清理,repository_cache 用較長 TTL,並以 HTTP/檔案鏡像做唯讀前置,減少 Worker 直寫壓力。若暫時只有單卷,也要不同頂層目錄+獨立水位告警,避免與系統卷、Xcode 預設路徑混桶造成索引風暴。
二、Gradle:遠端 build cache 唯讀與寫入邊界
Gradle remote build cache 在資源池常設 Worker 唯讀拉取(pull-only),寫入集中在合併後主線或專用 cache writer,避免 PR 矩陣互相覆寫遠端條目。將 GRADLE_USER_HOME 與本機快取目錄放第二卷,可明顯減輕與系統卷、Xcode 預設路徑的同步壓力。啟用 configuration cache 時務必鎖定外掛與 Gradle 版本,否則鍵空間抖動會讓遠端快取「看似命中、實則全 miss」。TLS、mTLS、連線池與解壓都吃 CPU,壓測時要預留軟上限,並與 Bazel 遠端快取節點共用同一套逾時與熔斷策略。
三、同機多 Job:xcodebuild 並行度與 Bazel/Gradle 疊加上限
每 Job 獨立 -derivedDataPath。並行度為相乘:同機 Job 數 N × Bazel --jobs × Gradle --parallel × xcodebuild 測試/模擬器數——NVMe 再快也有佇列上限;await 與 iowait 同升時先降 N 或降單 Job 內並行。冷/熱遠端兩組壓測看 P95 與快取 QPS,上限寫 Runbook。
- 快取鍵含 工具鏈+OS/SDK+儲存庫,防靜默錯命中。
- 遠端設逾時/熔斷,可一鍵本機全量構建。
- 監控 miss、await、wall time 聯動,勿只看命中數。
四、選型落地 FAQ
- 唯讀遠端首個合併慢?接受主線「種快取」或由少數 writer 寫入,換 PR 矩陣穩定。
- NVMe 很大還要分卷?要——隔離的是 I/O 性格與清理策略,不是容量焦慮。
- Bazel 遠端與本機 disk_cache 並存?須定義優先序與失效傳播,避免雙寫與鍵不一致。
- 合規與內網?快取節點與製品庫同級稽核;憑證、mTLS 與存取日誌納入季度巡檢。
在 Apple Silicon Mac mini 上壓這套模型
Bazel/Gradle 與 xcodebuild 同機共存時,macOS 單機最能還原資源池磁碟爭搶,縮小「本機能過、CI 掛」的溫差;Mac mini 具高頻寬 NVMe 與統一記憶體,利於同時餵多條快取讀線與索引,待機約 4W 適合 7×24 壓測與對照實驗。Gatekeeper、SIP、FileVault 降低無人值守面風險,長期 TCO 常優於堆通用 PC。若要為資源池加獨佔對照機,可先開啟 Macstripe 首頁 比對機型與節點。Mac mini M4 仍是 2026 年驗證「分區+唯讀遠端+並行上限」的高性價比起點;把磁碟 await 與快取 QPS 跑穩,再上遠端放大命中。若你想把本文方案跑在最貼近量產的硬體上,現在正是入手或租用一台獨佔 Mac 的好時機——從首頁進入即可比對配置。