2026 年跨区 Mac Mini M4 上,瓶颈常在 xcodebuildParallel Testing、重叠 SimulatorDerived Data 对 APFS 的压力。本文用参数表把 -parallel-testing-enableddestination模拟器并发预算,和构建锁、路径策略、1TB / 2TB 验收清单连成决策矩阵,可直接贴进 runbook。

横向加区加节点能扩 Apple CI,直到两作业争同一可写树,或四个 destination 纸上并行、CoreSimulator 却把墙钟拖死。destination 扇出作业级并行是两套预算:单进程喂几台模拟器 vs 单机在统一内存与磁盘成为瓶颈前允许多少构建。事件风暴会放大痛感,节流见 《Watchman 与 Git、磁盘水位矩阵》,与下表一并写进流水线文档。

参数表:-parallel-testing-enabled、destination 数量、模拟器并发

-parallel-testing-enabled YES 会在一次调用内把测试摊到多个 destination并联集群里请分别约束 每进程 destination每节点 Simulator 启动并发;盲目加 destination 常在内存、启动争用或快照 IO 撞墙。优先加节点、拆 scheme。

-parallel-testing-enabled Destination 数量(每进程经验值) Simulator 并发预算(每节点)
NO(单车道默认) 1(单一 -destination 真机 1~2;共享主机上 UI 测试建议固定为 1 以保稳定。
YES,偏单元测试 2~3(同 SDK / 兼容运行时族) 2~3 台错开启动;另设并发 作业 上限,避免总数盲目相乘。
YES,混有 UI / 快照套件 ≤2(先靠 节点并行 横向扩展,再考虑加 destination) 固定 2 并配内存压力告警;跨区跑法优先可复现,而非峰值扇出。
验收提示:在预发 Mac Mini M4 上把 destination 从 1 扫到 4,记录测试阶段 p95。当中位 CPU 微涨而 p95 走平或变差时即拐点——那是单进程天花板,应先买对称节点而非继续加 destination。

若流水线任一步触及共享卷上的数据库,请与 《共享卷 SQLite WAL 与单写者矩阵》 对齐写入策略,避免 Parallel Testing 掩盖 WAL 检查点风暴。

构建锁

多进程同写 Derived Data 或产物树会伤模块缓存、制造重试即消失的 flaky。构建锁规定:同一制品谱系在发布窗口仅单写入者。

调度器串行(如 Nomad 单一 promote)与 flock 小包临界区互补:防双作业被调度成发布者、防脚本/rsync 半写交错。模式与 《Nomad 亲和、构建锁与磁盘矩阵》 的单晋升车道一致。

LOCK_FILE="/var/tmp/xcode-derived-publish.lock"
flock -n "$LOCK_FILE" bash -c '
  xcodebuild -scheme "$SCHEME" -parallel-testing-enabled YES test
  rsync -a "$LOCAL_DERIVED/Build/Products/" "/Volumes/CIArtifacts/$BUILD_ID/"
' || { echo "lock busy"; exit 17; }

编译与大部分 Derived Data 工作应放在锁 之外;仅签名、就位重命名与权威树更新属于锁内。锁定树勿挂 SSHFS——请用本机 APFS 或锁定语义有文档的网络文件系统。

Derived Data 路径

共享 CI 上默认 Derived Data 易成多人博弈。请用 按作业划界-derivedDataPath(如流水线 ID 子目录),避免并行写同一索引,再只归档/rsync 所需产物。

  • CI 变量:路径绑定不可变作业 ID;失败目录快删,成功产物按保留策略存。
  • 模拟器数据:CoreSimulator 与运行时单独计量,随 Xcode 升级膨胀。
  • 只读缓存:依赖缓存只读挂载;可变缓存多写者须同等 flock。

跨区晋升时编译节点 Derived Data 可本地保留,产物走对象存储或 rsync;红构建以文档路径为准排查。

磁盘清理阈值

Parallel Testing 会加速堆积中间产物与模拟器数据。1TB/2TB 统一用 利用率带(约 70/80/90%)作轨;2TB 是缓冲不是豁免。

利用率带 1TB:动作 2TB:动作
约 70% 以下 xcrun simctl delete unavailable、修剪旧 Derived Data、周扫 CI 临时目录。 同节奏。
70~80%(黄) 规划扩容/外迁;下调 destination 与并发作业。 先砍 Simulator 并发与作业扇入。
80~90% 冻结重 UI 与全量 clean;收缩同步载荷。 先清闲置运行时。
约 90% 以上(红) 停纳新扇出;换/排空存储;审快照;水位上大盘。
70%
例行自动化线:定时清理不靠人肉救火。
80%
黄色:本迭代重设并行或采购磁盘。
90%
红色:停纳新负载;加节点或升档前 CI 勿变事故台。

验收摘录:周更 df 与 Simulator 占用;-derivedDataPath 无碰撞;Parallel Testing 上限写入带版本 runbook;黄区工单、红区容量评审。采购请用下方公开页比价,免登录浏览。

常见问题

destination 加多了测试没更快。 Simulator、内存或磁盘 IO 已饱和。先跨节点拆 scheme 或降低每节点 Simulator 并发,再考虑加 destination。

flock 频繁忙。临界区过宽;把锁收窄到签名与最终发布。

2TB 仍很快进黄区。 多为多份 Xcode Beta 与运行时——百分比阈值不变,但运行时退役策略要更严。

若矩阵指向「加对称节点、统一磁盘档位」,可直接前往本站 购买 页选配 Mac mini M4,并在 价格 页核对月费与区域组合后再结算。

本文为运维向指引。 CLI 与 Simulator 行为随 macOS / Xcode 演进;表中数字为启发式,请在预发验证、文档化删除策略,并按保留与合规要求调整探针。
并联 Mac 容量

在 Parallel Testing 把磁盘推到红线前,先加齐 Mac mini M4 节点

请在站内公开页 价格购买 比对套餐并发起下单——无需登录即可浏览;另可参考 帮助 了解规格与流程。用统一磁盘档位横向扩展 Xcode CI,Simulator 预算与 1TB/2TB 阈值才能在各区域保持可预测。

购买 Mac mini M4 查看价格(免登录)