资源池容量与并发模型
先把「能同时跑几路重 IO」说清楚:单节点 Apple Silicon 虽强,但 NVMe 仍会被多路 git fetch、npm ci、镜像同步叠加打满。建议按「拉取阶段」与「编译阶段」拆分并发预算。
| 场景 | 建议并发(拉取类) | 说明 |
|---|---|---|
| 单共享 Mac,多 CI Job | 2~4 路 | 同时 clone/fetch + npm 解压易顶满 IO;超出后排队优于全失败 |
| 含 Docker 层拉取 | 1~2 路 | 与 Git/npm 错峰;大层解压与链接占 IO 与 inode |
| 仅增量 fetch + 缓存命中高 | 4~8 路 | 前提:缓存分区独立、命中率高且磁盘水位健康 |
分场景步骤(上线前):① 调度层为「依赖安装」加全局信号量(如每节点 3);② 每 Job 独立 TMPDIR 与构建目录;③ 压测 10 分钟混合负载,记录 iostat await 与空间曲线。
Git / NPM 拉取队列与锁
Git 的 pack 写入、npm 的缓存锁与同一 node_modules 目录并行安装,是资源池最常见的「假死」来源。用队列把「同一仓库根」或「同一全局缓存」串行化,往往比盲目增大超时更有效。
- 同一裸仓库缓存(bare mirror):全局 1 写多读;fetch 写操作串行,clone 可并行读。
- npm 全局缓存:每节点环境变量
npm_config_cache指向 SSD 独立路径;高并发时改为「每 Job 子目录缓存」或限制并行 install 数(如npm ci --prefer-offline前置 warm)。 - CI 层排队超时:等待槽位不宜超过任务 SLA 的 20%~30%;超过则扩容节点或拆分资源池。
与单点工具参数配合时,可对照站内Git/npm 拉取稳定性 FAQ中的超时与重试示例,再在资源池外加一层「并发闸门」。
磁盘与缓存分区阈值
系统卷与构建缓存卷应分开监控;告警阈值建议与「最大单次依赖体积 × 并发」挂钩,而不是只看平均值。
| 对象 | 告警 / 熔断(可用空间占比) | 动作 |
|---|---|---|
| 系统卷(/) | ≤15% 告警 / <10% 拒绝新拉取 | 清理日志与旧 Xcode/DerivedData;迁移缓存到数据卷 |
| 构建与依赖缓存卷 | ≤20% 告警 / <12% 触发 LRU 清理 | 按项目或按周清理 npm/Git 缓存;保留最近 N 次成功构建产物键 |
| IO 延迟(await ms) | >20ms 持续 5 分钟 | 降低并发、错峰 Docker 层拉取、检查是否同盘混放数据库日志 |
缓存键策略与分层目录可继续参考Git/npm CI 缓存策略一文,把「命中率」和「水位」一起纳入值班面板。
弱网超时与断点策略
资源池出口常为多 Job 复用;弱网下应「拉长单次读超时、限制并发、指数退避」,避免惊群重试把网关打挂。
| 类型 | 建议阈值(起点) | 退避 |
|---|---|---|
| Git HTTP 低速窗口 | lowSpeedLimit 1000 B/s,lowSpeedTime 60~120s |
失败重试 3 次,间隔 10s / 30s / 90s |
| npm fetch | fetch-timeout 60000~120000ms;fetch-retries 5 |
fetch-retry-mintimeout 10000ms 起 |
| CI 步骤总超时 | 依赖安装阶段为整 Job 时限的 35%~50% | 超时后先落盘日志与缓存键,再重试「仅依赖」子步骤 |
分场景步骤(跨境/高丢包):① 镜像/registry 就近;② 并发 1~2 并启用离线缓存;③ 大仓浅克隆或 partial clone;④ 配合Git 与 Docker 拉取加速指南的网络建议。
验收与监控指标
上线资源池策略后,用一周窗口观察以下指标,避免「参数好看、业务仍抖」。
- 拉取阶段 P95 时长:较调优前下降或波动收窄;与并发曲线对齐分析。
- 磁盘可用占比最小值:高峰不低于你设定的熔断线;若频繁触底,优先减并发而非加超时。
- 因锁/队列等待的失败率:应接近 0;若升高,缩短队列等待 SLA 或增加节点。
- 出口重试率:重试占总请求比例突增时,检查镜像健康与并发闸门。
常见问题 FAQ
Q:已经限了并发,为什么仍偶发 npm EEXIST/EBUSY?
A:多为并行写同一缓存目录或杀毒/索引器锁文件。改为每 Job 独立缓存子目录,并将构建根路径加入排除列表。
Q:磁盘还有 12% 空间却大量超时?
A:可能是 inode 或 APFS 快照、时间机器本地切片占满元数据;同时检查 IO await。空间「百分比」需与绝对剩余 GB 一起看。
Q:池内 Mac 规格不一时如何设统一阈值?
A:以最小磁盘与最慢盘的 Job 为基准设全局并发;高性能节点单独标签与更高并发策略,避免「最短板」拖垮队列。