WAL チェックポイントが「ランダム」な CI 遅延に見える理由
WAL は読み書き重ねに強い一方、チェックポイントは fsync の塊になり、並列コンパイルや APFS/ネットワーク共有の混雑と重なると CI の尾側だけが伸びます(SQLite エラーには出にくい)。
- ロック意味論: DB・
-wal・-shmで一貫したロックが要る。NAS 実装差は watchman/git 稿 と同様に計測前提。 - 監視: 使用率だけ見ずサイドカー容量も。成果物同期は rsync 稿 とパス整合。
共有ストレージ上の WAL:ライターを増やす前に満たすべきこと
ローカル APFS と「全ノードが同一 SMB の build_state.db」は別物。ネットワーク FS 上のロックは 測定 必須。ライターは CPU 比例で増やさず単一レーン優先。詰まればローカル複製か Postgres。
対話検証は Mosh/SSH 稿 で輸送とストレージを分離。
実行可能 PRAGMA/journal_mode メモ(ステージング先行)
捨て可能なクローンで。先に journal_mode。怪しいストレージは synchronous=FULL、慣れてから NORMAL。
-- DB を開いたあと: PRAGMA journal_mode=WAL; -- 書込権限が要る/ジャーナル再構築の場合あり PRAGMA synchronous=NORMAL; -- fsync 意味論が不明なら FULL を検討 PRAGMA temp_store=MEMORY; -- RAM に余裕があれば temp を共有ディスクから外す PRAGMA busy_timeout=8000; -- ms。即失敗よりバックオフ PRAGMA wal_autocheckpoint=1000; -- ページ。小さいほど頻繁だが小さめのチェックポイント -- 任意:キャッシュ上限(負数は KiB)。ホスト RAM に合わせて調整 PRAGMA cache_size=-64000; -- 負荷試験の前後で確認: PRAGMA journal_mode; PRAGMA page_count; PRAGMA wal_checkpoint(PASSIVE); -- TRUNCATE/RESTART はメンテ窓のみ
wal_autocheckpoint は過敏だと小停止連発、鈍いと一発フリーズ。計測して調整。ネットワーク上の大きな mmap_size は慎重に。
キュー同時実行の上限(同一ファイル・多ワーカー)
同一パスの ホット SQLite 1 ファイル(CI メタ)向けの出発点。大版 Xcode/Swift のたびに再計測。
| パターン | ライター同時上限 | リーダー同時上限 | 運用メモ |
|---|---|---|---|
| 検証済み SMB/NFS + WAL | 1 | 2〜4 | ライタータスクはキューで直列化。リーダーはロック拷問試験通過後のみ。 |
| ホスト毎ローカル APFS 複製 | 複製ファイル毎に 1 | ローカル読みは実質無制限に近い | 結果はロック下の単一昇格ステップでマージ。 |
| 不明/レガシー NAS | 共有 0(DELETE またはリモート DB) | 並列オープンを増やさない | 静かな破損リスクが便利さを上回る。 |
全体同時数は高くてよい。狭めるのは 同一 DB パス のみ。Nomad・ロック稿 と同じ二段の考え方。
ビルドロックとチェックポイント:クリティカルセクションを短く
昇格ロックは rename/署名など短く。長ロックは WAL 滞留→解放後にチェックポイントが一括追従。スケジューラ直列化+flock の二段。wal_checkpoint(RESTART) は静穏窓のみ。
決定マトリクス:SQLite ファイルはどこに置くか
共有 SQLite 一択案のレビュー用。1TB/2TB 水位と併用。
| トポロジ | WAL 推奨 | チェックポイント/IO リスク | 選ぶとき |
|---|---|---|---|
| ノード毎ローカル DB + rsync/マージ | APFS 上で WAL | 低め。チェックポイントはローカル。 | 並列コンパイル数が高く、明示マージ付きの最終一貫で足りる。 |
| 単一 SMB/NFS ゴールドコピー | ロック拷問試験後に限り WAL | 中〜高。RTT とロック待ちに結合。 | 小規模チーム・厳格な単一ライターキュー・NAS 運用が強い。 |
| 同一パスへのマルチライター扇展開 | 避ける | 深刻なジッターと整合リスク。 | 再設計:シャード、ライター列、または中央サーバ。 |
1TB/2TB ディスク水位受入チェックリスト(WAL + CI)
受入前にストレージと CI で合意。スナップショット同居ならしきい値を締める。
- 1TB: 大カタログで
.wal+.shm+DBが約 8〜12 GB 持続、または使用率 ~78% が複数スプリント→容量レビュー。 - 2TB: WAL バイトがチェックポイント時間を決める。~85% で新規実験ストップの目安。
- 同居・バックアップ: 代表ビルドと並行してチェックポイント p95 を SLA と照合。
-wal/-shmは原子的コピーか online backup。 - 跨リージョン: RTT・ロック待ちを DNS/レジストリ稿 と同板に。
FAQ
DELETE にすべき? サイドカーは減るが本体への書込増幅。NAS が怪しいときの暫定にはなるが恒久はストレージかローカル複製。
Apple Silicon? キャッシュは助かるが支配的は NVMe/ネット競合。Mac mini M4 実機で計測。
サインオフ: SRE+CI オーナー。調達は 1TB/2TB シグナルで段階アップ時期を先に。