多專案 iOS 團隊在跨區 Mac mini M4 並聯跑 Detox 時,曲線常誤導決策:真正吃緊的是 Simulator 會話預算、派生製品扇出與 1TB/2TB 磁碟水位。本文用決策矩陣收斂並發與 rsync,並附可貼監控的驗收清單。
請與站內 Xcode Parallel Testing 與 Simulator 磁碟文、rsync 決策矩陣、Nomad 建置鎖、watchman/FSEvents 節流 一併閱讀;共享卷若含 SQLite 產物再讀 WAL 共享卷矩陣。
- 並發假象:把 Simulator 當執行緒數會低估 framebuffer、CoreSimulator 資料層與截圖寫入。
- 產物競態:多 job 共用同一 Derived 樹,Detox 易因半成品編譯在手勢中段 flake。
- 磁碟峭壁:1TB 節點對夜間多 shard 開機容忍低;逾九成必須硬停而非只清日誌。
並發上限
以「同機同時 online 的 Simulator 數」為硬欄杆,再回推 Detox worker 與 Packager;跨區請扣 WAN 預熱。下列為單節點起點,M4+16GB 宜先壓在表中位。
| CI 情境 | Detox worker/job | Simulator 並發(同機 boot) | 磁碟策略註記 |
|---|---|---|---|
| 主線/PR 煙測 | 1 | 1–2 | 保留截圖輪替;Derived 每 job 子目錄 |
| 夜間多專案 shard | 2–4(分 repo 佇列) | 2–3 | 與 promote 分樹;快取唯讀+本機增量 |
| 1TB 保守 | 1 | 1(串接佇列) | 關閉非必要錄影;CoreSimulator 週清 |
量測優先:同時採 UI 執行緒 CPU、尾端延遲與卷宗寫入速率;僅在磁碟水位綠燈時提高並發,並對齊監控告警。
產物 rsync 參數
跨區暖快取建議:rsync -aH --partial --numeric-ids,必要時加 --checksum 或 --times 擇一為增量權威;WAN 段加 --bwlimit。共享母目錄上避免未協調的 --delete。細節對照 叢集 rsync 文。
- 可引用:窄目錄切片(單一 scheme/單一 runtime)降低重傳面積。
- 可引用:先
rsync --dry-run再進排程,保留稽核。 - 可引用:promote 目錄與 Detox 暫存目錄分 prefix,避免互刪。
鎖與佇列
排程器並行與 flock 擇一為權威;鎖檔放本機 SSD。多專案佇列建議「repo 維度」公平輪轉,避免單一 monorepo 占滿 Simulator 名額。
LOCK_FILE="/var/tmp/detox-promote.lock"
flock -n "$LOCK_FILE" bash -c '
rsync -aH --partial "$CACHE_SLICE/" "$WARM_TARGET/"
' || { echo "promote busy"; exit 19; }
與 Nomad/GitLab Runner 併用時,對齊 親和與鎖粒度,避免雙軌互卡。
擴容策略
先以「水位+佇列深度」決策是否加節點或升 2TB,勿只看 CPU。觸發閾時應同步下調 Simulator 並發。
| 使用率 | 1TB 節點 | 2TB 節點 | 建議動作 |
|---|---|---|---|
| < 70% | 維持表列並發;排程清過期 xcresult |
可保留較多裝置快取 | 綠燈 紀錄趨勢 |
| 70%–80% | 黃燈:worker 減半或升級儲存 | 黃燈:刪舊 Derived/CoreSimulator | 縮 shard、暫停錄影留存 |
| > 90% | 紅燈硬停:停新 dispatch,清 Derived/暫存後放行 | 佇列背壓至回綠 | |
落地五步驗收:
- 節點回報:卷宗使用率、Simulator 上限、Derived 根路徑。
- 單 repo 乾跑:量測尾端延遲與每輪寫入 GB。
- rsync dry-run 納入合併前檢查。
- 鎖檔路徑與排程並寫入 runbook。
- 黃燈演練:確認自動降並發與告警路由。
70%
例行清理與趨勢圖;腳本 dry-run。
80%
收斂 Detox 與 Simulator 並發;通知值班。
90%
硬停清 Derived/CoreSimulator 後再放行。
轉化並聯資源:若要以獨佔 Mac mini M4 補齊 Simulator 名額與 1TB/2TB 儲存,請至 購買(免登入)、方案/價格;連線與配額疑問見 說明中心。
本文為工程實務建議。 Detox、Xcode 與 CoreSimulator 行為隨版本演進;請以官方文件與鎖定版本為準。大量刪除前務必 dry-run。