共有ボリューム上の SQLite WAL は便利そうに見えて、チェックポイント並列ビルドの IO が尾側レイテンシを食います。2026 年版決定マトリクスPRAGMA 例・キュー上限ビルドロック1TB/2TB 受入と FAQ

Nomad・ロックrsyncブログ一覧

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/レジストリ稿 と同板に。
1
共有ホット DB の既定ライターは 1。
78%
1TB:拡張/WAL オフロードを計画。
85%
2TB:新規実験ストップ、負荷下で計測。

FAQ

DELETE にすべき? サイドカーは減るが本体への書込増幅。NAS が怪しいときの暫定にはなるが恒久はストレージかローカル複製。

Apple Silicon? キャッシュは助かるが支配的は NVMe/ネット競合。Mac mini M4 実機で計測。

サインオフ: SRE+CI オーナー。調達は 1TB/2TB シグナルで段階アップ時期を先に。

運用目安。 PRAGMA は本番コピーで検証。ロックは NAS 依存—ベンダ/SQLite 版の正と突き合わせ。
専有 Mac CI

Mac mini M4 の台数とディスク段階を先に固める

料金・プランで 1TB/2TB 前提を揃え、購入ヘルプを runbook 横に。

プランを比較 ヘルプセンター