当你已经把 Mac mini M4 当作可调度节点,并为 CI 与 Agent 混池写好并发切片与公平性矩阵,下一类故障往往来自「组织政治」:A 项目「现在就要这台机」,B 项目作业已在跑,值周同学被要求「把优先级顶一下」。若没有明文规则,每一次升级都会变成对人不对事的扯皮。本文给出 2026 年可落地的第二层治理:把单机上的重作业能力拆成可签约的预约槽,定义何时允许抢占,并用冷静期防止高优先级流量反复杀死队列造成震荡。文内含两张决策表、八步 rollout 清单,以及与容量借调、队列 SLO、可调度节点文档的显式衔接。
公平性与切片基线见上文链接;临时把容量划给自动化见 容量借调;排队深度与扩缩见 队列等待 SLO。若你用标签区分自动化主机,请与 可调度 Mac 节点 中的 CMDB 字段保持一致。加机参考 定价与区域,连接与权限见 帮助文档。
预约 vs 弹性溢出:先把词定义清楚
预约(reservation)是一份合同:团队 X 在本地工作日 09:00–21:00 内,对标签 mac-ci-heavy 上最多 R 个并发重作业享有优先权,与楼里是否还有其他人无关。弹性溢出指其余一切:有空位就跑、没空位就让路的作业,适用于实验分支与低严重度流水线。若编排器无法同时表达两种语义,你会在 Slack 里无限次手写「临时规则」。预约应少而精、带时间边界、绑定成本中心;弹性应是默认路径。
在 Apple Silicon 上,「空位」不仅是 CPU。两个重叠的 xcodebuild 常把常驻内存推到 28~36 GB 区间,第三个任务即便 CPU 表盘好看也可能 OOM 或极端 swap。预约数量必须与你在公平性矩阵里用过的工作负载类别对齐——重编译、多模拟器 UI、仅 lint——而不是每团队一个全局数字。否则会出现「签了三个槽」但每个槽其实是整套 UI 套件、本应只占一个槽的合同欺诈(无意或有意)。
抢占策略矩阵(何时允许杀作业或重新入队)
| 进入作业 | 受害者负载 | 是否抢占 |
|---|---|---|
| Sev-1 发布热修(有事故单) | 弹性 lint / 文档构建 | 可——受害者带原因码重新入队 |
| Sev-1 发布热修 | 另一团队在合约窗口内的预约重槽 | 否——用空闲主机或书面高管例外并留审计痕迹 |
| 无事故 ID 的「老板急」 | 任意 | 否——按弹性处理;扩容而非抢占 |
| 夜间定时浸泡 | 交互式研发 CI | 否——改浸泡起钟点或专用浸泡标签 |
核心不变量:抢占是治理动作,不是谁都能拧的调度旋钮。每次合法抢占应产出:事故或变更单号、受害者作业 ID、授权工程师。审计时若一分钟内拿不出这三样,说明政策写在 PPT 里而非系统里。多数团队发现:除书面高管例外外禁止抢占预约持有者,比调任何超时更能减少周末电话。与「口头 P0」文化对抗时,把本表打印在值班手册封面比开十次架构会有效。
冷静期与防震荡参数
| 事件 | 建议冷静期 | 原因 |
|---|---|---|
| 作业被抢占(重入队) | 同一项目 15~30 分钟内不得再次发起抢占 | 避免两个「急单」打乒乓球 |
| 预约窗口开始 | 开头 5 分钟宽限——禁止新抢占 | 让在跑弹性作业体面收尾 |
| 主机维护归来 | 10 分钟仅允许弹性轻作业 | 避免冷缓存瞬间被重编译打满 |
指标挂钩:每周统计抢占次数并与 p95 墙钟回归做关联。若抢占上升而 SLO 未改善,属于震荡——应加机或缩短预约窗口,而不是再加杀戮。
八步落地清单
- 盘点标签:确保
mac-ci-*与 Agent 标签不会误命中同一预约规则。 - Git 编码预约:YAML 写明负责人、时间窗、每类负载的 R。
- 编排器钩子:实现不可从仓库文件覆盖的「预约令牌」或队列优先级。
- 抢占 API:单一内部端点或 slash 命令,强制记录工单 + 受害者 + 操作者。
- 冷静期状态:在队列元数据或 Redis 记录每项目上次抢占时间并设 TTL。
- 看板:一块展示「预约槽占用/应得」,一块展示「每日抢占次数」。
- 演练:用模拟 Sev-1 与弹性受害者彩排,验证审计日志字段齐全。
- 季度评审:连续八周利用率低于 40% 的预约应 sunset——闲置 entitlement 腐蚀信任。
与并发切片、磁盘治理如何咬合
预约解决谁有权占位,并发切片解决单机安全并发。若合同给团队两个预约重槽,但每机切片只允许一个不触发 swap 的重编译,合同即虚假。发布预约数字前,用公平性矩阵与 磁盘与产物保留策略 回放一遍——抢占风暴常与 DerivedData 风暴同现,被杀作业往往在磁盘留下半成品。
若同池还跑 OpenClaw 等自动化,要么为 Agent 单独设 R_agent 预约类,要么在营业时段禁止抢占 Agent 机。把「CI 抢占」与「网关重启窗口」混为一谈,会得到最难查的 flaky:预发全绿、生产偶发因为那里没人抢占。
财务分摊:不要幻想表
预约是内部 chargeback 的自然输入:每预约槽·小时可从 Mac 摊销、电力与机柜成本计价;弹性用量可用低价或打包进平台工程。常见错误是财务在未经 SRE 背书的情况下「拍脑袋定槽数」——当预约总和超过物理安全并发时,要么项目为空气付费,要么 SRE 为告警付费。建议每月发布一页纸:「每台 M4 安全重槽上限」对照「各团队签约预约之和」。
常见反模式
无限优先级档(P0~P9)却无抢占规则——人人标 P0;抢占不通知受害者——研发花半天查「假 flaky」;月更团队却持永久预约——容量囤积;冷静期为 0——两位总监交替顶掉对方流水线。纠正这些更多靠把上表写进与 Runner 镜像同一仓库,而不是再买监控 SKU。
在财季锁预算前需要额外专用机验证预约数学,可用带 SSH/VNC 的短期 Mac mini M4 按真实标签重放生产拓扑,用真构建证明安全 R,而非用 PPT 证明。NodeMac 在香港、日本、韩国、新加坡与美国提供节点,按需付费降低试错成本,与「冻结共享构建机做实验」相比更省协作摩擦。