2026 OpenClaw на аренде Mac Mini: SQLite WAL, плановые чекпойнты, busy_timeout, inode и термически управляемая деградация очереди с воспроизводимыми шагами
Команды, которые держат состояние сессий агента в одном файле SQLite на арендованной Mac Mini, сталкиваются с ростом WAL, редкими SQLITE_BUSY и перегревом корпуса при ночных батчах. Ниже — матрица параметров, шесть воспроизводимых шагов с launchd и caffeinate, связка OpenClaw 2026.5.x с термодеградацией очереди и блок наблюдаемости 7×24 до пользовательского инцидента.
Контекст серии: раздел OpenClaw в блоге, Healthchecks и цепочка задач, матрица WAL для долгих батчей.
Три узких места локального SQLite под OpenClaw
- Раздувание WAL без чекпойнта. Длинные ночные вставки увеличивают
-walи задержку fsync на APFS, что маскируется как «медленный CPU», хотя узкое место — журнал. - Конкуренция писателей и читателей. Шлюз держит короткие транзакции, а фоновый экспорт состояния — длинные снимки; без
busy_timeoutи явного порядка блокировок растёт доля SQLITE_BUSY. - Термический предел Apple Silicon. Плотный батч без caffeinate и без снижения параллелизма при нагреве даёт троттлинг и каскад ретраев, который умножает запись в WAL и давит на inode логов шлюза.
Матрица параметров: чекпойнт, busy_timeout, inode, backoff очереди
Строки — режимы; столбцы задают операционные рычаги для Mac Mini в аренде без выделенного администратора круглосуточно.
| Режим WAL checkpoint | busy_timeout (мс) | Inode водораздел | Backoff очереди OpenClaw |
|---|---|---|---|
| PASSIVE по таймеру launchd | пять–десять тысяч | жёлтая зона выше семидесяти пяти процентов inode | база пять секунд, потолок шестьдесят секунд |
| RESTART в окне тишины UTC | десять–тридцать тысяч | красная зона выше девяноста процентов inode | удвоение базы до стабилизации термодатчика |
| TRUNCATE после ручного аудита | тридцать тысяч только на окно | любой рост при свободном месте ниже десяти процентов APFS | жёсткий потолок одна минута и один воркер |
Шесть воспроизводимых шагов: схема, launchd, термодеградация и срезы
- Схема SQLite. Таблица
agent_sessionsс полямиid,payload_json,updated_at; таблицаcheckpoint_metaс последним режимом и размером-wal; индекс по времени обновления для ночных срезов. - PRAGMA при старте.
journal_mode=WAL,synchronous=NORMALпри отдельном UPS-политике узла,busy_timeout=10000,foreign_keys=ON. - launchd для checkpoint. Отдельный plist каждые пятнадцать минут вызывает
sqlite3 /var/db/openclaw/state.db "PRAGMA wal_checkpoint(PASSIVE);"сThrottleIntervalне меньше девяноста секунд и логом в тот же каталог что nginx перед шлюзом. - caffeinate и термодатчик. Обёртка батча через
caffeinate -dimsu; скрипт читаетpowermetricsили упрощённый SMC-срез и пишет флаг/tmp/openclaw_thermal_degradeпри превышении порога нагрева, который читает конфигурация OpenClaw. - Связка с OpenClaw. При наличии флага шлюз снижает параллелизм воркеров, увеличивает backoff между HTTP-исходящими вызовами и откладывает тяжёлые шаги пайплайна, сохраняя идемпотентность по
batch_idкак в гайде Healthchecks. - Срезы крупных сессий. Поля
payload_jsonрежутся на чанки по шестидесяти четырём килобайтам логического JSON с ссылкойparent_session_id, чтобы укоротить транзакции записи и снизить пиковое давление на WAL без потери трассировки.
Наблюдаемость 7×24: журнал, inode и задержка записи
Экспортируйте в JSON Lines размер файла -wal, долю SQLITE_BUSY, длительность транзакций и температуру в один временной ряд; эскалируйте если три сигнала деградируют в одном пятиминутном окне.
- Тренд один: рост WAL при плоском RPS шлюза указывает на отсутствие PASSIVE checkpoint или на слишком длинные транзакции экспорта.
- Тренд два: рост задержки записи без роста CPU часто совпадает с заполнением inode логов и временных файлов на том же томе APFS.
- Тренд три: термический флаг и рост очереди исходящих вызовов коррелируют с ретраями ночного батча и требуют ручного TRUNCATE только после подтверждения свободного места.
Дополнительно фиксируйте версию страницы schema_migrations и хеш конфигурации OpenClaw в том же артефакте nightly, чтобы откат шлюза и откат PRAGMA не расходились по процедурам постмортема на арендованном узле без физического доступа.
Опорные величины для постмортема и аудита
- busy_timeout в диапазоне пять–тридцать тысяч миллисекунд согласован с матрицей и длиной ночного окна.
- PASSIVE checkpoint каждые пятнадцать минут при стабильном WAL ниже одного гигабайта на узле с двумя terabyte APFS.
- Inode жёлтая семьдесят пять процентов, красная девяносто процентов; свободное место APFS критично ниже десяти процентов перед TRUNCATE.
- Backoff очереди база пять секунд, потолок шестьдесят секунд, при термодеградации удвоение до стабилизации датчика.
FAQ: конкуренция блокировок и заполнение диска
Почему растёт SQLITE_BUSY при WAL и OpenClaw?
Конкурируют долгий читатель, писатель шлюза и фоновый wal_checkpoint; увеличьте busy_timeout, согласуйте режим checkpoint и укоротите транзакции, чтобы укладываться в SLA ночного батча.
Что делать при заполнении диска и росте WAL?
Проверьте inode и свободное место на APFS, выполните контролируемый wal_checkpoint(TRUNCATE) в окне тишины, отключите избыточное логирование и переведите OpenClaw в деградацию очереди до восстановления водораздела.
Итог и оформление аренды узла
Mac Mini M4 под шлюз с локальным SQLite: главная, тарифы, помощь SSH и VNC, оформление аренды, блог.
Итог: сочетайте PASSIVE checkpoint, контролируемый busy_timeout, мониторинг inode и термическую деградацию очереди OpenClaw, чтобы марафонский контур на арендованной машине оставался предсказуемым.
Рядом: DNS и стабильность батча.