2026 OpenClaw на аренде Mac Mini: SQLite WAL, плановые чекпойнты, busy_timeout, inode и термически управляемая деградация очереди с воспроизводимыми шагами

Чтение: 10 минут

Команды, которые держат состояние сессий агента в одном файле SQLite на арендованной Mac Mini, сталкиваются с ростом WAL, редкими SQLITE_BUSY и перегревом корпуса при ночных батчах. Ниже — матрица параметров, шесть воспроизводимых шагов с launchd и caffeinate, связка OpenClaw 2026.5.x с термодеградацией очереди и блок наблюдаемости 7×24 до пользовательского инцидента.

Контекст серии: раздел OpenClaw в блоге, Healthchecks и цепочка задач, матрица WAL для долгих батчей.

Три узких места локального SQLite под OpenClaw

  1. Раздувание WAL без чекпойнта. Длинные ночные вставки увеличивают -wal и задержку fsync на APFS, что маскируется как «медленный CPU», хотя узкое место — журнал.
  2. Конкуренция писателей и читателей. Шлюз держит короткие транзакции, а фоновый экспорт состояния — длинные снимки; без busy_timeout и явного порядка блокировок растёт доля SQLITE_BUSY.
  3. Термический предел 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, термодеградация и срезы

  1. Схема SQLite. Таблица agent_sessions с полями id, payload_json, updated_at; таблица checkpoint_meta с последним режимом и размером -wal; индекс по времени обновления для ночных срезов.
  2. PRAGMA при старте. journal_mode=WAL, synchronous=NORMAL при отдельном UPS-политике узла, busy_timeout=10000, foreign_keys=ON.
  3. launchd для checkpoint. Отдельный plist каждые пятнадцать минут вызывает sqlite3 /var/db/openclaw/state.db "PRAGMA wal_checkpoint(PASSIVE);" с ThrottleInterval не меньше девяноста секунд и логом в тот же каталог что nginx перед шлюзом.
  4. caffeinate и термодатчик. Обёртка батча через caffeinate -dimsu; скрипт читает powermetrics или упрощённый SMC-срез и пишет флаг /tmp/openclaw_thermal_degrade при превышении порога нагрева, который читает конфигурация OpenClaw.
  5. Связка с OpenClaw. При наличии флага шлюз снижает параллелизм воркеров, увеличивает backoff между HTTP-исходящими вызовами и откладывает тяжёлые шаги пайплайна, сохраняя идемпотентность по batch_id как в гайде Healthchecks.
  6. Срезы крупных сессий. Поля 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, чтобы марафонский контур на арендованной машине оставался предсказуемым.

Mac Mini M4: SQLite WAL и OpenClaw

RunMini: узел для ночных батчей с локальным состоянием. Главная, тарифы, помощь, аренда.

Рядом: DNS и стабильность батча.

Аренда узла под SQLite и OpenClaw