2026-05-09 Xcode コンパイラ索引ストアパス(INDEX_DATA_STORE_PATH / INDEX_STORE_PATH)、並列レーン分離とレンタル Apple Silicon クラウド Mac での NVMe 配慮(HK / JP / KR / SG / US)
並列の xcodebuild レーンはあらゆる負荷を増幅します—ディレクトリが重なると NVMe リースを静かに苛むコンパイラ索引シャードも同様です。Xcode は DerivedData 隣に索引を置き、Apple は「Xcode でアプリをビルドする」で関係を説明します。運用側はそのモデルを DerivedData/TMPDIR 分離、並列ジョブ枠、整形ログ+xcresult ゲートと結び APFS の揺らぎでも赤ビルドを説明可能にします。2026-05-09 版では衝突形、パス定型、保持、そして COMPILER_INDEX_STORE_ENABLE=NO が妥当なケースを整理します。
Xcode 2026 パイプラインでもインデックスルート分離が重要な理由
増分コンパイルは熱せられた索引に恩恵がありますが、CI フリートがデスクトップの単一ユーザー前提を踏襲することは稀です。リースホストは PR を同時多重化します。衝突は読みにくい Clang 依存関係スキャナの停滞 や重複モジュールマップを招きます。DerivedData と一緒に索引ストアを隔離しましょう。「クリーンは成功・ダーティは失敗」調査の後追いではなく最初からです。
共有ビルダーでのインデックスストア衝突の解剖
- 古い読み取り側 — POSIX 親パスを共有するとレーン B がレーン A の未書き込みシャードを読む。
- COW 増幅 — クリーナーが原子生成された微小シャードを同時大量削除すると APFS メタデータが嵐になる。
- シンボリックリンクの罠 — DerivedData だけ高速ボリュームへ移し索引コンパニオンを置き忘れる。
長時間並列ランで iostat を見張りましょう。ジッターは壁時計グラフが動く前に索引ホットスポットを示します。
DerivedData ドキュメントに橋渡しする標準パス
隔離ガイドの DerivedData ベースラインに従い、Index.noindex/DataStore 系サブツリーを追加するか、IDE 既定外の素の xcodebuild では明示的な INDEX_DATA_STORE_PATH を使います。命名例:
BASE="${TMPDIR%/}/job-${JOB_UID}"
DERIVED="$BASE/dd"
IDX="$BASE/clang-index"
export DERIVED_DATA_DIR="$DERIVED"
export INDEX_DATA_STORE_PATH="$IDX"
両方を同一 TMP 親に置くと追い出しポリシーが一致し xcrun ツール類も単純化します。
フラグ:INDEX_DATA_STORE_PATH、INDEX_STORE_PATH、COMPILER_INDEX_STORE_ENABLE
現行ワークフローは Xcode が Clang に渡す正として INDEX_DATA_STORE_PATH を優先します。薄いラッパーで過去の Xcode が環境変数のミラーを期待する場合は INDEX_STORE_PATH も同一に設定します。
COMPILER_INDEX_STORE_ENABLE=NO が効くとき:一度コンパイルして捨てる短命タスク—静的メタデータ出力やスクリプト資産検証など—ただし節約 IO が再実行時の増分キャッシュ損失を上回るか壁時計で測ってください。
明示フラグは決定的な xcodebuild -derivedDataPath と組み合わせ、xcbeautify ログを原因分析で実ディレクトリへ逆引きできるようにします。
Mac mini M4 リースでの並列レーン設計
香港・東京・ソウル・シンガポール・米国では CPU だけでなくユニファイドメモリを尊重して同時レーンを割り振ります。レーンが増えるほどハッシュディレクトリ起因で索引ファンアウトが非線形に増えます。APFS 断片化センサーが上昇したら並列度を下げます。
不変条件
- 同じ DerivedData ベース名へ同時ビルドを向けない。
- xcresult バンドルをアーカイブしたら冷索引をディスクから退避。
- プールごとに固定した Xcode メジャーへレーン数を合わせる。
保持スケジュールと APFS/NVMe 書き込み増幅
索引ディレクトリはオブジェクトより早く散らばります。中断後もシャードが残りやすいからです。SLA 日数より古い INDEX_DATA_STORE_PATH を夜間スイープするジョブが反応的な rm -rf より優れます。数百万の小ファイルを圧縮器が耐えられるか確認してからアーカイブ圧縮—しばしば rsync 風ハードリンク昇格の方が無難です。
9 ステップのロールアウトチェックリスト
- 地域ごとの DerivedData と索引の重なりを棚卸し。
- オーケストレーション由来の一意パストークンを定義。
- ラッパーへ環境エクスポートを注入(GitLab shell、Jenkins agent、GH Actions shim)。
- xcbeautify ガイドに沿い構造化ログを揃える。
- 長時間並列リハーサルで APFS 断片化プロキシを測定。
- COMPILER_INDEX_STORE_ENABLE=NO のオプトアウトレーンを文書化。
- 週次ディスク傾斜が予算を超えたらアラート。
- オンコールへ索引ディレクトリ解剖を教育。
- plist とラッパーを tarball ロールバック付きでインフラ PR へマージ。
SLO 表:コンパイラ索引の衛生
| シグナル | しきい値 | 対応 |
|---|---|---|
| 共有索引親を検知 | いずれかの並行ジョブ | 即失敗;パストークンを拡げる |
| 索引の NVMe I/O 時間 | 索引が壁時計の > 12% | 選択的に NO;レーンを再配分 |
| クラッシュ後の回復 | 手動掃除が月 > 30 分 | TTL スイープを自動化 |
FAQ
| 質問 | 実務的回答(2026-05-09) |
|---|---|
| リモート Xcode Cloud にも当てはまる? | 概念は移ります—ワーカーが PR を多重化する場所では明示ルートが暗黙既定に勝ちます。 |
| ビルドごとに無垢ホスト? | 短命のマシンイメージでも RAM ディスク内に一意索引パスが必要。並列スモーク同時起動の競合を避けます。 |
Mac mini M4 ベアメタルが索引ノイズを抑える理由
ユニファイドメモリは過剰割当ハイパーバイザ共有 VM より PCIe 往復を抑え、Clang 索引ライターをキャッシュホットに保ちます。フリート規模は 地域見積もり で調整し、対話的に詰まったコンパイルフェーズは SSH アクセス手順 を頼ってください。