リソースプール容量と並行モデル
プールではディスク帯域と同時取得上限を先に決めます。同時ジョブは min(CPU/2, ディスク許容) 目安に抑え、git fetch/npm ci 等は直列化または別キューへ。
- 計測:
diskutil/モニタで使用率と await を確認。 - 上限:下表を初期値にし、P95 が悪化したら並列を 1 段階下げる。
- 分離:モノレポ用と軽量用 runner を分けキャッシュ汚染を避ける。
Git/NPM 系プルキューとロック
同一ワークスペース複数ジョブは .git/index.lock 等で競合します。作業ディレクトリ分離、共有キャッシュは RO+オーバーレイ、またはロック付きキューで直列化してください。
| リソース | 推奨同時実行(単一ノード目安) | ロック/キュー戦略 |
|---|---|---|
| Git fetch/clone(同一ボリューム) | 2〜4 | repo 単位 mutex、または shallow/cache ディレクトリ分離 |
| npm/pnpm/yarn install | 1〜2 | キャッシュは共有可、node_modules はジョブ専用 |
| Homebrew/CocoaPods | 1 | 更新系はグローバルロック、CI では事前ボトルイメージ化を検討 |
| Docker pull | 1〜2 | レイヤー競合を避け、プル後に prune 閾値を設定 |
ディスクとキャッシュパーティションの閾値
使用率が高いとメタデータが遅延し並行プルが失敗しやすくなります。システムとビルド・キャッシュは分離推奨。詳細はキャッシュ戦略。
| 指標 | 警告(Warning) | 制限(Throttle) | 緊急(Halt) |
|---|---|---|---|
| ボリューム使用率 | ≥ 80% | ≥ 85%(新規大容量プルをキュー) | ≥ 90%(不要キャッシュ削除/ジョブ延期) |
| 空き容量(絶対値) | < 30 GB | < 15 GB | < 8 GB |
| ディスク await(ms) | > 20ms が 5 分継続 | > 50ms | > 100ms(プル並列度を半減) |
| Docker イメージ | — | 週次 docker system prune | タグ LRU で 72h 未使用削除などポリシー化 |
※ 空き GB は SSD 容量に合わせてスケール(例:1 TB なら警告を 50 GB へ)。
弱い回線のタイムアウトとレジューム戦略
CI のジョブ timeout と Git/npm 側を入れ子にします(ツール側を長め、CI 外枠で打ち切り)。
| レイヤー | パラメータ例 | 推奨開始値 | リトライ退避 |
|---|---|---|---|
| Git(HTTP) | http.postBuffer、lowSpeedLimit/lowSpeedTime | 500MB、1000 B/s × 120s | ジョブ単位 3 回、2n×5s 上限 120s |
| npm | fetch-timeout、fetch-retries | 120000ms、5 | fetch-retry-mintimeout 20000ms 程度 |
| Homebrew | HOMEBREW_CURL_RETRIES | 5〜8 | brew 更新はメンテナンスウィンドウで直列化 |
| CI ジョブ | step timeout | プル専用 step 15〜25 分 | 失敗時はキャッシュヒット経路へフォールバック |
-
A
高遅延回線:まず並列度を下げ、
git clone --depth 1とキャッシュ付きfetchに切り替える。 -
B
断続的切断:ミラー/社内プロキシのキープアライブを確認し、SSH の
ControlPersistを併用(プル安定性 FAQ)。
受け入れと監視指標
受け入れの目安はピーク時のプル失敗率とP95 壁時計です。
- プル系失敗率 < 1%(週次)
- ディスク 85% 超の継続 < 1h/日
- キュー P95 がスロットリング前比 +20% 以内
- await/使用率/失敗率が閾値 3 連続で通知
よくある質問 FAQ
Q. スペックアップで並行プルは無制限?
A. メタデータ I/O が壁になりやすく、CPU だけでは限定的。キューとキャッシュ分離が先です。
Q. 複数リポで npm ci 同時実行は?
A. 同一ディスクは 1〜2。超えるなら別ノードまたはバッチ化。
Q. ポリシーの置き場所は?
A. Runbook と再利用ワークフローに閾値・エスカレーションを明記。
まとめ
共有リモート Macではディスク水位とディスク IOを先に設計し、並行プルのキュー深度とタイムアウト・リトライを表の初期値から調整するのが近道です。