2026年 Xcode 26 リモート Mac CI:xcodebuild のコンパイルキャッシュ、Derived Data 戦略と並列ビルドの性能劣化を SSH で切り分ける意思決定マトリクス
キャッシュヒットとディスク競合を混同しないこと。本稿では、リモート Mac CI 上の Xcode 26/xcodebuild におけるキャッシュ層、Derived Data の三つの運用パターン、並列度を上げたときに全ジョブが遅くなる事象を、SSH 上でそのまま貼れる観測コマンドと症状→仮説→対処のマトリクスで整理します。
1. リモートの Xcode ビルドが「気まぐれに」速い/遅い理由
無人の SSH セッションでは、xcodebuild は常に三つの力の合成として振る舞います。コンパイラキャッシュが再利用できるか、Derived Data がどう隔離されているか、同一マシン上の並列ジョブがディスク帯域と熱余裕を奪い合っていないかです。チームによってはキャッシュを全部消して「直す」一方で増分ビルドを壊したり、逆に Derived Data を共有して並列書き込み下でのモジュールキャッシュ破損に悩んだりします。
複数ランナーを 1 台のリモート Mac に載せるなら、まずトポロジー(同時実行数とパス)を揃えてからキャッシュを調整します。パッケージ解決とビルドキャッシュの相互作用は M 系 Mac mini 上の SPM/visionOS 系 CI パイプラインでも触れているので、そこでパイプライン実体をイメージしたうえで、下の Derived Data ルールを当てはめてください。
2. xcodebuild のキャッシュ:残すものと捨てるもの
粗いメンタルモデルがあると、切り分けがぶれません。
- Clang/モジュールキャッシュ:多くは Derived Data 配下や成果物ごと。SDK フラグが安定しているなら、増分ビルドのために残す価値が大きいです。
- Swift コンパイラキャッシュ:モジュール境界・最適化レベル・マクロと強く結びつきます。ブランチや Package 解決の変更でフルリビルドが走るのは、しばしば「ディスクが遅い」のではなく依存グラフの変化です。
- 明示的クリーンのコスト:
xcodebuild cleanや Derived Data 全削除はコールドパスを強制します。リリース系や破損疑いには有効ですが、PR ごとのデフォルトには向きません。プロジェクト単位の Derived Data パスを優先しましょう。
3. Derived Data 戦略:三つのパターン
2026 年の Xcode 26 CI ランブックにそのまま貼れる表です(マウント点はインフラに合わせて置き換えてください)。
| パターン | やること | メリット | リスク |
|---|---|---|---|
| ジョブごと | -derivedDataPath を一時ディレクトリや実行ごとに一意のサブディレクトリへ |
隔離が最強、再現性が高い | キャッシュヒット率が低く、ディスク書き込みが重い |
| リポジトリ/ブランチ系プール | 安定したルート+ワークスペースやブランチ系ごとのサブパス | 増分と隔離のバランス | 同一ツリーへの並列書き込みを防ぐロックまたはキューが必須 |
| 共有読み取り専用+ローカル書き込み | シードキャッシュは読み取り専用、ジョブは書き込み可能レイヤをコピー/オーバーレイ | コールドスタートが速い | 構成が増える。整合性検証が必要 |
運用ルール:並列度が 1 を超えるなら、複数の xcodebuild プロセスを同一の-derivedDataPath に向けないでください。ファイルロック・単一フライトキュー・ターゲットシャーディングなどで直列化しない限り、断続的なモジュールマップエラーや Swift 型検査フェーズの「たまに異常に遅い」現象を招きます。
4. 並列ビルドでの性能劣化:まず疑うところ
単一ジョブは速いのに複数だと全体が這うときは、Xcode のメジャー版を疑う前に次を見ます。
- NVMe/SSD の飽和:並列コンパイルはランダム書き込みを増幅し、リンクや
statフェーズが膨らみます。 - サーマルスロットリング:小型 Mac では 2 本の重い
xcodebuildツリーで電力/温度壁に当たりやすいです。 - メモリ圧力:リンカやインデックスで RAM が跳ね、圧縮とページングで時間がギザギザになります。
- 共有 Derived Data のロック競合:体感は「ディスクが遅い」ですが、トレースは特定ディレクトリのリトライを指します。
ベアメタルの専用ホストは、仮想化を積み上げた共有プールよりレイテンシが安定しやすく、ビルド SLA とキュー深さを同じ表で見積もるときの比較軸になります。ヘッドレス CI ラボの落とし穴とセットで読むなら SSH 経由リモート Mac mini のヘッドレス CI ラボ構築ガイドを参照し、観測ポイントをランブックに繋げてください。
5. SSH だけで使える観測コマンド
GUI 不要。診断ジョブやオンコール手順にそのまま埋め込めます。
- Derived Data のマウントで
df -h:ディスク満杯と高レイテンシのネットワークボリュームを検知。 sysctl hw.ncpuとvm_stat:CPU 数とページング圧力の素早い把握。- 短時間の
powermetricsサンプルやtop -o cpu:二重xcodebuild負荷での周波数低下を確認。 xcodebuild -showBuildTimingSummary:コンパイル/リンク/スクリプトに時間を帰属し、ネットワークのせいにし過ぎない。
6. SSH 切り分けマトリクス(症状 → 仮説 → 対処)
| 見える症状 | 有力な仮説 | 対処(優先順) |
|---|---|---|
| 並列度 > 1 のときだけ遅い | ディスク帯域または共有 Derived Data の競合 | -derivedDataPath を分割。並列度に上限。同一ツリーへの複数書き込みを排除 |
| 単一ジョブでも遅い+ページング多い | RAM 不足またはリンカスパイク | 並列コンパイルスレッドを下げる。RAM 増設。巨大ターゲットの分割 |
| モジュール/ヘッダが途方もなく欠ける | キャッシュ破損または並列ライターによる中間生成物の上書き | ジョブ単位クリーン。ジョブ単位 Derived Data。ロック追加 |
| Xcode アップグレード直後の初回だけ極端に遅い | ツールチェーンとインデックスの再構築 | シードキャッシュを一度ウォーム。コールドとホットの基準をアラート化 |
| Run Script フェーズがタイムラインを支配 | スクリプト内のネットワーク、署名、公証ステップ | スクリプトにタイミングログ。依存物のキャッシュ。署名/公証の段分離 |
7. まとめ:パイプラインに方針をコード化する
2026 年のリモート Mac CI(Xcode 26)では、Derived Data パスのルール、フルクリーンをいつ行うか、最大並列度、ディスク水位アラートをパイプラインに焼き込みましょう。障害時は、ハードや Xcode を変える前にマトリクスで「キャッシュ層」か「リソース争い」かを決める。そうして初めて、p95 ビルド時間をキュー深さと無関係な帯域に押し込めます。
この運用を載せるなら Mac mini が現実的な理由
ここまでの xcodebuild・Derived Data・ヘッドレス観測は、macOS を第一級の実行基盤に置いたときに一番素直に実装できます。ハイパーバイザ越しにディスク挙動やツールチェーンの癖を再解釈する必要がなく、Apple Silicon のユニファイドメモリはリンカ負荷のバーストをやり過ごしやすくします。Mac mini クラスはアイドル電力が約 4W 程度に抑えやすく、ファンレスに近い静音性と相まって、24×7 のビルドノード向きです。
総保有コストでは、監査可能な専用実機 1 台が、パーセンタイルに「隣人ノイズ」を混ぜる安価な共有プールに勝つことがよくあります。Gatekeeper、SIP、FileVault は、汎用ホストで増えがちなツールチェーン汚染やマルウェア面を抑えます。上記のキャッシュ方針をレイテンシが読めるハードで回したいなら、2026 年現在でもMac mini M4 はコストパフォーマンスの良い入口の一つです。
キュー深さとメモリ余裕に合う構成を選び、方針をコードに落としたうえで、トップページからプランを確認して次の一歩に進んでください。