Безопасность · OpenClaw

Утечка памяти в Gateway: как замерить RSS и прикрыться

Покажем, как увидеть рост RSS у `openclaw-gateway`, поставить heap-лимит и собрать диагностику до того, как процесс убьёт OOM.

· 4 мин чтения

Коротко

  • RSS openclaw-gateway растёт монотонно: 350 МБ → 15,5 ГБ за 2–3 дня. Дальше OOM, тихая гибель процесса, launchd перезапускает его в цикле.
  • Один из участников обращения #91588 связал рост с rest-деструктурированием на каждом фрагменте потока и условными spread-операциями в baseModelCallEvent. ClawSweeper считает локализацию неустановленной.

Сверено с документацией OpenClaw 2026.9.8, 7 октября 2026.

Проблема воспроизводится на macOS и Linux с разным набором плагинов. Ниже — минимальный набор команд и настроек, чтобы увидеть рост и прикрыться до фикса.

Что происходит

В Issue #91588 на трекере OpenClaw Питер Ченг привёл замеры с macOS. После старта openclaw-gateway занимает около 350 МБ RSS. Через 2–3 дня обычной работы RSS доходит до 15,5 ГБ на машине с 8 ГБ RAM. Система уходит в своп, затем процесс убивает OOM. launchd перезапускает его, цикл повторяется по несколько раз в сутки. В gateway.err.log записей нет, процесс умирает молча.

Артур Соареш привёл замеры с Linux-хоста. При --max-old-space-size=6144 OOM не срабатывает, но к седьмому дню главный JS-поток залипает на 100% CPU. p99 задержки цикла обработки событий — около 8000 мс. Маркус Лассфолк описал похожую картину: снимок кучи показывает 28 строк по 0,5–1,16 МБ с дубликатами ACP codex-сессий.

Где ищут корень

После серии замеров с отключёнными плагинами Ченг локализовал причину в самом Gateway. На каждом фрагменте модельного потока выполняется rest-деструктурирование responseStreamChunkByteLengthUnchecked в selection-*.js (строка 8387). Когда фрагмент обёрнут в Proxy через observeModelCallStream, V8 переводит объект в словарный режим. Дальше срабатывает Runtime_CopyDataPropertiesWithExcludedPropertiesOnStack, который копирует ключи на каждом фрагменте. Вдобавок в baseModelCallEvent (строка 8459) лежат семь и больше условных spread-операций на каждый вызов модели.

ClawSweeper отметил, что высокой уверенности в воспроизведении на текущем main нет, а предложенные heap-ограничения и автоперезапуск не указывают, что именно удерживает память. Обращение остаётся открытым, готового исправления в релизе нет.

Мониторинг RSS

Самый простой способ — следить за выводом ps -o pid,rss,comm. В обращении #91588 Питер Ченг показывал RSS так:

ps -o pid,rss,comm

Оставляйте запас до объёма физической памяти и до значения --max-old-space-size.

Heap-лимит и сторожевой таймер

В обращении #91588 отсутствие heap-лимита названо одной из причин OOM на машине с 8 ГБ RAM. Там же предлагают добавить лимит по умолчанию (например, 4096 МБ) и перезапуск по RSS выше 4 ГБ как защиту.

Установка сервиса и основные команды:

openclaw gateway install
openclaw gateway start
openclaw gateway stop
openclaw gateway restart
openclaw gateway uninstall

Чтобы Gateway не замолкал на macOS после серии падений, добавьте проверку живости из документации по launchd. После серии крашей launchd перестаёт реагировать на KeepAlive=true, нужен внешний kickstart:

# Example launchd-aware liveness check, suitable for a 5-minute cron or LaunchAgent
state=$(launchctl print gui/$UID/ai.openclaw.gateway 2>/dev/null | awk -F'= ' '/state =/ {print $2; exit}')
if [ "$state" != "running" ]; then
  launchctl kickstart -k gui/$UID/ai.openclaw.gateway
fi

Точка отката и диагностика

Перед любыми действиями сохраните рабочую версию. Если рост RSS не подтвердится, вы вернётесь за минуту.

openclaw gateway status
openclaw status
openclaw logs --follow
openclaw doctor
openclaw gateway status --deep

Для обращения соберите диагностический пакет. Экспорт работает и на нездоровом Gateway:

openclaw gateway diagnostics export
openclaw gateway diagnostics export --output openclaw-diagnostics.zip
openclaw gateway diagnostics export --json

В чате владельца доступна команда /diagnostics. Она требует одного подтверждения и сохраняет zip локально. Полезные файлы для прикрепления к обращению: summary.md, diagnostics.json, manifest.json и свежий stability/latest.json.

Что проверить у себя

  1. Выполните openclaw gateway status --deep и проверьте state и runs в выводе launchctl print gui/$UID/ai.openclaw.gateway.
  2. Замерьте RSS командой ps -o pid,rss,comm и записывайте в лог сутки.
  3. Сравните суточный прирост с запасом до объёма физической памяти и до планируемого --max-old-space-size.
  4. Если прирост заметно больше ожидаемого или RSS превысил 4 ГБ, соберите openclaw gateway diagnostics export и приложите к обращению #91588.