Ниже — компактная матрица решений и чек-лист приёмки. Стык с выкладкой артефактов и rsync смотрите в руководстве по rsync и блокировкам; планировщик и flock — в материале про Nomad, аффинити и build lock; шторм событий ФС и пороги диска — в статье про Watchman, Git и водяные знаки 1 ТБ/2 ТБ. Оглавление всех материалов — лента блога.
Три узких места общего тома
- Чекпоинт WAL против сборок: перенос страниц из
-walв основной файл — тяжёлая фаза; если она совпадает с пиком линковки, растёт хвост latency у очереди. - Несколько писателей: два процесса, которые считают себя «хозяевами» одной базы на сетевом томе, ломают инварианты быстрее любого бенчмарка; нужен один канонический писатель или локальная копия.
- Диск 1 ТБ и 2 ТБ: WAL и временные артефакты съедают запас параллельно; без общей политики порогов вы ловите красную зону одновременно на golden-узле и на воркерах.
Матрица: где живёт SQLite и кто пишет
| Топология | WAL и чекпоинт | Сборки и IO |
|---|---|---|
| Локальный APFS на каждом Mac | Рекомендуемый режим: journal_mode=WAL, контролируемый autocheckpoint. | Параллельные Xcode job изолированы по узлу; корреляция только по сети promote. |
| Один общий каталог на NFS/SMB | Риск файловых блокировок и кэшей клиента; проверяйте семантику fsync. | Ограничьте одновременных писателей в очереди; смещайте окна wal_checkpoint от компиляции. |
| Золотой узел + fan-out | Единственный процесс пишет WAL; остальные только читают после атомарного rename снимка. | Согласуйте с flock promote и профилями rsync из связанной статьи. |
Исполняемые PRAGMA и режим журнала
Сначала зафиксируйте фактическое состояние файла базы на томе, куда попадает CI. Затем применяйте политику согласованно на всех узлах кластера Mac mini M4, иначе метрики «плавают» между релизами.
sqlite3 "/Volumes/Shared/ci/metadata.db" <<'SQL' PRAGMA journal_mode; -- ожидайте wal для выбранного профиля PRAGMA synchronous; -- NORMAL чаще для WAL; FULL при жёстком риске потери PRAGMA cache_size; -- отрицательное значение = KiB под кэш страниц PRAGMA wal_autocheckpoint; -- страниц между автопопытками; снижайте при большом -wal PRAGMA mmap_size; -- 0 отключает mmap; иногда стабилизирует сетевой том PRAGMA journal_mode=WAL; -- идемпотентно, если уже wal PRAGMA wal_checkpoint(TRUNCATE); -- только в окне низкой нагрузки и одном писателе SQL
Если политика данных требует максимальной прочности на локальном диске, допустим краткий переход на DELETE или TRUNCATE в окне обслуживания; на разделяемом томе без доверенной блокировки предпочтительнее вынести запись на локальный путь узла и синхронизировать логическую модель, а не копировать сырой файл под конкурентными сборками.
Очередь и верхняя граница параллелизма
Для воркеров с записью в одну базу на общем томе закрепите в планировщике или в обёртке семафора жёсткий лимит одновременных подключений. Инженерный ориентир для приёмки без тонкого профилирования — от двух до четырёх активных писателей; выше допустимо только после замеров iostat, размера -wal и p95 задержки очереди. Параллельные Xcode-слоты на том же томе считайте отдельным IO-фронтом и сдвигайте фазу чекпоинта.
Пять шагов внедрения
- Инвентаризация: найдите все пути
*.dbна разделяемых томах и пометьте владельца сервиса. - Режим журнала: выполните блок PRAGMA выше; зафиксируйте вывод в runbook версии 2026-04.
- Сериализация записи: оберните критическую секцию в
flockили выделите один Nomad job promote, как в связанном материале. - Окно чекпоинта: внесите
wal_checkpointв cron или post-step после снижения параллелизма. - Наблюдаемость: метрики размера WAL, задержки fsync и заполнения тома на дашборде SRE; алерты завязаны на те же пороги, что и таблица ниже.
Приёмка: водяные знаки 1 ТБ и 2 ТБ
| Заполнение | Действие |
|---|---|
| до ~70% | Рутинная чистка DerivedData, старых снимков WAL и временных каталогов сборки. |
| 70–80% | Снизьте одновременность очереди и rsync fan-out; план расширения диска или узла. |
| >90% | Стоп новым тяжёлым job до освобождения; риск срыва чекпоинта и каскада ошибок SQLite. |
Публичные тарифы помогают заранее заложить конфигурацию 2 ТБ на golden-узле; процедуры доступа описаны в справочном центре.
FAQ
Можно ли держать одну SQLite с WAL на SMB/NFS для нескольких Mac mini M4? Только если файловая семантика блокировок и fsync надёжна для вашей связки; иначе выносите каноническую БД на локальный APFS узла и реплицируйте логически, либо используйте один узел-писатель и read-only копии после чекпоинта.
Почему параллельные Xcode-сборки усугубляют WAL на общем томе? Пиковый случайный IO и рост -wal конкурируют с чекпоинтом; без лимита очереди и без смещения фаз растёт джиттер latency. Согласуйте окна PRAGMA wal_checkpoint с политикой build lock и rsync из смежных материалов блога.
Какой верхний предел одновременных воркеров с одной БД на общем томе разумен в 2026? Ориентир для инженерной приёмки: от двух до четырёх одновременных подключений с записью в одну базу на том; выше — только после профилирования iostat и размера WAL на вашем профиле IO.
Разведите WAL, сборки и диск по узлам кластера
Оформите пул одинаковых Mac под CI: локальный APFS для горячих баз, отдельный канал promote и запас по 1 ТБ или 2 ТБ до жёлтой зоны. Справка по SSH и доступу, тарифы и покупка — без входа в консоль.