DevOps 2026年4月3日

2026 决策矩阵:独占 Mac mini M4 上 macOS CI 的磁盘水位、DerivedData 与构建产物保留

NodeMac Team

构建基础设施编辑

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 模板变量,减少「谁删了我的包」类工单。

六步有序清理清单

  1. 基线快照:记录 df -h 与最大目录 du Top 10
  2. 摘掉入站标签:防止清理中途有新作业写入。
  3. 删过期临时目录:按工单号或构建号匹配 > 72 h 的目录。
  4. 执行 DerivedData LRU:保留默认分支与最近 5 个活跃分支的缓存。
  5. 验证最小绿构建:跑一条标准流水线含签名步骤。
  6. 挂回标签并观察 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 与构建耗时数据复盘,比口头强调「记得清盘」有效得多。与 队列等待 SLORunner 排空 联动时,可把磁盘软闸门作为编排器前置条件,形成闭环。

清理窗口需要备用构建机?

港·日·韩·新·美 M4,SSH/VNC——与主池隔离做整理。

NM
NodeMac Cloud Mac
5分钟部署

在云端租用专用的 Apple Silicon Mac。SSH/VNC 访问,港·日·韩·新·美节点。

立即开始