在遠端 Mac M4 跑 CI 或本機式 Xcode 建置,瓶頸常落在 -jobs 與記憶體尖峰、Derived Data 與系統碟搶 IO,以及跨區 RTT 對「小步互動+大步建置」組合的體感。本文給可列印的對照表與閾值,並銜接 跨區節點、批處理與買租成本、 APFS 餘量與 IO 清單思維;首次連線可參考 SSH/VNC 上手清單。
① 編譯並行與記憶體峰值
xcodebuild 的 -jobs N 與 Swift/Clang 連結階段 RSS 並非線性:模組圖深時單 job 可能達數百 MB 至數 GB。遠端機若同跑模擬器或 Agent,宜為系統與快取保留約 2–3GB再調 N。
可先以 N=2 量測尖峰,再套 floor((可用 GB − 保留) ÷ 單 job 估算 GB);CI 宜將編譯與測試/打包分 stage,避免同矩陣搶 RAM。
| M4 記憶體檔位 | 建議 -jobs 起點(無模擬器) | 單 job 粗估與備註 |
|---|---|---|
| 16GB | 4–6;大型專案自 3 起測 | 單模組尖峰約 1.2–2.5GB 時常見;連結期再預留緩衝;OOM 先降 N 再談升檔 |
| 24GB | 8–12;巨型單 target 仍要 profiling | 可容許較深模組圖與少量背景程序;模擬器開著時 N 建議折半 |
上表為起點參考;請以專案實測為準。
② Derived Data 外置路徑與權限
將 Derived Data 指到外接 SSD,可把大量小檔寫入移出系統碟,減輕與 swap、暫存競爭。掛載點宜固定(如 /Volumes/BuildSSD),並以 Xcode 偏好或 xcodebuild -derivedDataPath 明確指定;CI 用腳本統一路徑。
權限:建置帳號須可讀寫該卷;多人 runner 可用每 job 子目錄避免快取互踩。
| 項目 | 建議做法 |
|---|---|
| 檔案系統 | 格式為 APFS;需與 Unix 工具鏈相容時,避免混用不支援的跨平台格式當主建置卷 |
| 區分大小寫 | 若與 Linux CI 對齊路徑語意,可評估區分大小寫 APFS 卷;團隊需約定一致,避免本機/遠端混用導致隱性錯誤 |
| 空間閾值 | 建置前可用空間建議 ≥ 預估產物 × 1.2;系統碟餘量仍建議 ≥ 15%(與平台監控告警對齊) |
| 掛載穩定性 | 確認睡眠/節能不移除外接;長 job 前以 diskutil info 確認掛載點與實體裝置一致 |
③ IO 配額與降溫閾值
編譯「卡住」常是 IO 佇列過長而非 CPU;可看活動監視器磁碟壓力或建置日誌停滯階段。
降溫閾值(告警/腳本):磁碟壓力連續偏高、系統碟可用 <15%、或並行建置超策略時,將 -jobs 降一檔;佇列層用指數退避(如 30s、60s、120s)避免重試打滿 IO。
④ 日韓港新 vs 美西節點取捨
建置屬長任務,但 git/artifact/互動除錯對 RTT 敏感。亞太團隊與 registry 在區內時宜日韓港新;強依賴美西儲存或控制器時選美西較省回程。下表為 RTT 參考,請以實測為準。
| 路徑(示意) | 典型 RTT | 對 Xcode 遠端建置的含義 |
|---|---|---|
| 香港 ↔ 新加坡 | 約 25–45 ms | 東亞互備合理;適合頻繁小步與中等體量 artifact |
| 東京/首爾 ↔ 港或新 | 約 35–70 ms | 並行編譯可跑;大檔建議分塊、就近儲存或拉長超時 |
| 東亞各點 ↔ 美西 | 約 110–190 ms | 互動式操作感明顯;長建置尚可,宜合併步驟、減少往返 |
日租/月租:尖峰驗證適合日租;若每月開機日數 > D*=月租/日租(代入實價),月租通常更平滑。詳見買租試算。
⑤ 失敗重試 FAQ
Q:codesign 間歇失敗?
A:查金鑰/鑰匙圈與是否多 job 同寫 derived;可單 stage 重試並快取產物。
Q:I/O error 或極慢?
A:多為磁碟抖動;降 -jobs、確認外接掛載、清子目錄後退避重試。
Q:OOM 重試仍失敗?
A:降 N 或串列連結、關背景程序;必要時升 24GB 或拆 target。
Q:換區快取失效?
A:快取版本化;昂貴步驟用物件儲存/registry 就近種子。