Mac mini M4 をすべて無限の CPU スライスだと見なすプラットフォームチームは、ロードアベレージが穏やかなのにキューだけが跳ねる現象に驚きがちです。原因はたいていメモリ圧、シミュレータの肥大、または APFS の空き容量の崖です。本稿では、並列実行とメモリ階層を対応付けるマトリクス A、チェックアウトとアーティファクト戦略に対するディスク予算を示すマトリクス B、変更チケットへ貼れるロールアウト手順八つ、検索エンジン向け FAQ 構造化データまでを一度にまとめます。
まず前提を共有します。Apple Silicon は GPU とニューラルエンジンを統合したメモリ階層を持ち、CI のように短時間に大量のコンパイルとリンクを繰り返すワークロードでは、ホスト単位の「最大並列」がそのままスループットになりません。オーケストレータが CPU のみでスケジューリングすると、ディスクレイテンシやメモリ圧縮がダッシュボードに現れないままジョブ待ち時間だけが伸びます。だからこそ、ホストごとに同時実行の上限とディスク監視しきい値を先に固定し、その上でキュー深さや p95 待ち時間の SLO を定義する順序が重要になります。
チューニングではなく規模決定が答えになる痛みのサイン
- 単体では成功するジョブが束になると落ちる——四本のパイプラインが同一ホストに着地したときに典型的な、見えないスワップを伴う RAM の過剰割当。
- コード署名や公証まわりの間欠エラーが長時間稼働後に増える——Apple のサービスではなく、ディスク使用率が 85% 付近の膝を跨いだことと相関することが多い。
- キュー深さだけが伸びて CPU は 55〜70% 付近——オーケストレータが CPU しか見ていないため、ディスクや IO クレジット枯渇が赤いメトリクスとして表れない。
すでに バースト借用エンベロープ を運用している場合は、本記事を上流のガードレールとして読んでください。バースト判定が発動する前に、物理 Mac 一台が受け入れてよい同時ジョブ数を先に決めます。
マトリクス A — 同時レーン数とメモリ階層
以下の数値は Apple Silicon M4 とユニファイドメモリを想定しています。Screen Sharing のデバッグセッションを常時開いたままにする、同一筐体で OpenClaw のサンドボックスを動かす、などメモリを横取りする用途がある場合は一段階控えめに読み替えてください。
監視観点では、macOS の圧縮メモリとページアウト率を週次でレビューし、Xcode アップデートや macOS のマイナーアップデート後に一回はベースラインを再測定する習慣が効きます。チームによっては、シミュレータの世代混在や UI テストの動画キャプチャの有無だけで RSS がギガバイト単位で変わるため、サンプル週を四季それぞれで取ると説得力が増します。
| ユニファイド RAM 階層 | 快適な同時レーン | スワップ手前のハード上限 | 実証に使う計装 |
|---|---|---|---|
| 16 GB | 重い Xcode コンパイル 1 本 + 軽い静的解析 1 本 | UI シミュレータ並列 3(リスク高) | 分あたりのページアウト数と xcodebuild のピーク常駐セットを追跡 |
| 24 GB | コンパイル 2 レーン、またはコンパイル 1 + SwiftPM のみのサービス 2 | DerivedData を高速外付け SSD に置けば混在 4 レーンまで | 圧縮メモリが6 GBを 5 分連続で超えたら警告 |
| 32 GB 以上 | シミュレータシャーディング規則付きでコンパイル 3 レーン | ジョブごとの RAM 予算を強制できれば 5 レーンまで | レーン単位の cgroup または launchd メモリ上限をダッシュボードに公開 |
マトリクス B — ディスク予算とチェックアウト・アーティファクト戦略
CI Mac のディスクは「容量があれば足りる」単純な資源ではありません。モノレポでは DerivedData と中間生成物が指数関数的に増え、コンテナ型のエフェメラルワークスペースでは逆に毎ジョブのフェッチがネットワーク RTT に支配されます。どちらのモデルでも、ローカルに残すものとリモートに逃がすものを決めずに運用すると、ガベージコレクションが人間の夜間作業に依存します。
| シナリオ | ローカルビルドツリー維持 | 中間物のアップロード | 空き容量ガード |
|---|---|---|---|
| モノレポ + 大型 DerivedData | ○(LRU 退避付き) | ○ dSYM バンドルのみ | APFS システムボリュームの空きを50 GB未満にしない |
| コンテナ型エフェメラルワークスペース | × | ○ フルアーティファクト | 使用率が85%を超えたら再イメージまたは強制パージ |
| 長寿命の自社ホストランナー | ○ 月次コンパクション付き | 任意 | 保持マトリクスのしきい値とセットで運用 |
キュー深さが Grafana に嘘をつく理由
オーケストレータはラベルごとの「待機」カウンタを出しますが、macOS ホストはカーネルキューの内側にも仕事を隠します。無効化し忘れた Time Machine スナップショット、macOS アップデート後の Spotlight 再インデックス、APFS コンテナのコアレスなどが典型です。CPU グラフは動かず壁時計だけが伸びる。対策として Terraform を増やすのではなく、ホスト単位のテレメトリにディスクレイテンシのパーセンタイルとメモリ圧縮を含め、並列ジョブ数を下げられる運用設計が必要になります。
Mac mini M4 を地理分散で借りるチームほど、単一ホストの CPU 飽和ではなくエンドツーエンドのパイプライン遅延で比較すべきです。東京のアーティファクトバケット横のランナーでも、16 GB RAM に重い UI スイートを四本積めば遅く、クロックの低いバージニアで正直な並列キャップを守った半分 GHz の方が早く終わることがあります。だからマーケの「M4 は速い」ではなく、メモリ階層とレーン数をペアにした表を先に固定するのです。
最後に、プールごとのオーナーを文書化してください。オーナーのいない共有プールは、誰かが深夜に全ホストの DerivedData を削除するまで腐ります。圧縮メトリクスを週次で読み、Xcode アップグレード前にサインオフする当番オペレータを置き、オンコールと同列の運用にしてください。
一度だけ合意して自動化へ進む数値アンカー
- キュー SLO:営業時間内の macOS ジョブは待ち時間 p95 を 12 分未満——ここを超えるとエンジニアより先に財務が気づきます。
- 並列キャップ:テレメトリで余裕が証明されない限り、32 GB ホストあたりオーケストレータの既定並列は 4 に設定。
- ネットワーク RTT 予算:Git の実体がランナーから大洋を跨ぐ場合、チェックアウトだけで RTT が平均 30 ms 増える前提を織り込み、フォージと同じマクロリージョンにプールを置く。
ディスパッチのヒント:フリートを分割したら、どのラベルがどのメモリ階層にマップされるかを内部ドキュメントに固定し、製品チームが重い UI テストを 16 GB ホストへ黙って流さないようにします。ラベル設計は ディスパッチ可能な Mac mini M4 自動化 を参照してください。
ロールアウト八段階
- スナップショット:ホストごとの最大同時ジョブ数と、直近九十日のピークキュー深さカーブを取得する。
- 分類:一週間の RSS サンプルでパイプラインを重・中・軽のメモリプロファイルに振り分ける。
- 適用:口伝の「二並列」ではなくマトリクス A に沿ったオーケストレータ上限を設定する。
- 配線:ディスク監視は空き GB と使用率の両方でアラートする。
- リハーサル:金曜のカットオーバーはカナリアプロジェクトのみ——フリート全体のフラグデイは禁止。
- 公開:リージョン(HK、JP、KR、SG、US)とプール名の対応表を開発者が参照できる場所に置く。
- レビュー:四スプリント連続で週次レビューし、Xcode または macOS のマイナーアップデートでメモリ曲線が変わったらキャップを調整。
- スケールアウト:キャップを正直にした後も p95 待ちが SLO を上回るなら、専用ホストを増やす。
よくある質問
CPU だけ見たオートスケールではダメなのか?
メモリとディスクの崖を見逃します。ホストが健全に見える間にキューだけが深くなり、増設も遅れます。
同一フリートにバーストする AI ワークロードが混ざる場合は?
エージェントのサンドボックスは別ラベルまたは別リージョンのプールへ隔離してください。長時間 GPU 志向のエージェントと対話型 CI を混ぜるとキュー數学が崩れます。
より深いランブックはどこを読むべきか?
SSH の接続パターンは NodeMac の ヘルプセンター を参照し、そこから既存のオブザーバビリティエクスポータへマッピングしてください。
並列とディスクのガードレールが現実と一致すると、初めて Apple Silicon M4 の吞吐が壁時計の短縮に変換されます。ネイティブ macOS を専用筐体で走らせ、自動化には SSH、詰まった UI テストには VNC で覗く構成は、開発者のローカルと運用を揃えます。Mac mini M4 をクラウドでレンタルし、香港・日本・韓国・シンガポール・米国にプールを置けば、Git とアーティファクトのそばに計算を寄せつつラック購入を回避できます。ホスト単位で予測可能なキャパシティは過剰割当 VM より CI に効きます。マトリクスが別リージョンのスライスを要請したら、SKU を比較するために 料金ページ を開き、単一の英雄的マシンに全チームを積み上げないでください。