Шлюзы OpenClaw на круглосуточном macOS Mac mini иногда замирают без краша: в Slack гаснут индикаторы набора, в дашбордах «RPC probe: ok», но ответов ассистента нет 90+ секунд. Операторы часто вешают ярлык «падение модели», хотя корень — таймаут чтения, ожидающий байты, которые так и не завершили поток, либо полуоткрытая TLS-сессия после дёрганья Wi‑Fi. Этот ранбук отделяет зависания чтения от шторма HTTP 429, задаёт воспроизводимые базовые линии curl -m и связывает backpressure каналов с логами шлюза. Дополните его гайдом по 429 и Retry-After, когда статус приходит, но требуется бэкофф, и диагностикой doctor для шлюза по портам, bind и аутентификации. Если перед шлюзом стоит прокси, читайте укрепление обратного прокси и туннеля, чтобы idle-таймауты совпали на всём пути. Наконец, свяжите настройку таймаутов с бюджетом токенов, лимитами и троттлингом инструментов, чтобы ретраи не превращались в лавину.
Ниже — матрица симптомов, стартовые числа таймаутов, советы по логам macOS и FAQ для платформенных инженеров.
Сигналы, что вы ловите не тот режим отказа
Если дашборды RPC зелёные, а пользователи ждут, вы, скорее всего, в application-layer чтении, а не в смерти процесса. Ещё один маркер — частичный JSON-стрим: токены идут ≈300 мс, затем тишина — апстрим остановился посреди чанка.
Финансово понятные счётчики: число таймаутов чтения в час, средняя длительность «подвисания», брошенные диалоги и повторно открытые тикеты с тегом «завис ИИ». Без этих четырёх рядов нельзя доказать, что изменение таймаутов помогло.
Во время инцидента заморозьте фичи: снимите обезличенные tcpdump-резюме и ID TLS-сессий, затем откатите последнее изменение таймаута.
Документируйте временные «аварийные» повышения потолков только с номером тикета; иначе команды тихо раздувают лимиты в релизных окнах и удивляются счетам по воскресеньям.
Держите одну строку таблицы на окружение с connect, first-byte, idle и wall-clock — аудиторы смогут сравнить staging и production за пять минут на мостике.
Матрица: таймаут чтения, 429, DNS
| Симптом | Вероятный класс | Первая проба |
|---|---|---|
| HTTP 429 с Retry-After | Лимит | Следовать гайду провайдера по бэкоффу |
| Нет статус-строки дольше connect | Зависание чтения | curl -m ступенями к URL апстрима |
| Мгновенный NXDOMAIN | DNS | dig +trace с хоста шлюза |
Стартовые таймауты, проходящие аудит
Стартовые клиентские ручки: connect 5 с, чтение до первого байта 45 с для разговорных моделей, idle между чанками стрима 12 с, общий wall clock на ход пользователя 180 с до выдачи структурированной ссылки-эскалации.
Ограничьте ретраи после таймаута чтения двумя на сообщение пользователя, если у провайдера нет объявленного инцидента.
Когда публикуют окно обслуживания, заранее снизьте конкурентность на 20 % за 15 минут до старта — меньше пересекающихся ретраев, усиливающих зависания.
Версионируйте таблицы таймаутов в Git: дежурный не должен гадать, какие константы были в проде во время сбоя.
Рецепты воспроизведения через curl
# Ступенчато поднимайте потолок, чтобы найти место зависания апстрима
curl -sS -o /dev/null -w '%{http_code} %{time_connect} %{time_starttransfer}\n' \
-H "Authorization: Bearer $TOKEN" \
-m 10 https://api.example.com/v1/models
curl ... -m 30 ...
curl ... -m 60 ...
Прогоните ту же последовательность с хоста шлюза и с бастионного прыжка: расхождение time_starttransfer намекает на сеть, а не на OpenClaw.
Добавьте -w '%{remote_ip}', чтобы убедиться, что DNS попал в ожидаемый anycast POP во время «коричневых» зон.
Для стриминга используйте --no-buffer и пропускайте вывод через pv, чтобы отличить паузу сервера от локального backpressure терминала — это экономит часы на тикетах «ничего не печатается».
Когда корпоративный прокси режет chunked, curl может буферизовать до EOF — копируйте настройки HTTP-библиотеки шлюза (HTTP/1.1 против HTTP/2), чтобы байты совпадали один в один.
macOS, launchd и давление на диск
launchd терпим к нагрузке, но подробный дебаг-лог может блокировать запись, если на корневом томе осталось < 12 % свободы — зависания выглядят как «модель молчит», пока процесс ждёт write().
Смотрите diskutil apfs listVolumeGroups во время инцидентов: локальные назначения Time Machine в той же группе томов могут отъедать IOPS у раздела логов без явного CPU-алерта.
Резюмирование TLS-сессий маскирует редкие зависания чтения: периодически форсируйте свежие рукопожатия на диагностических клиентах, когда бисектите вендора.
Если закупка железа тормозит, арендуйте облачный Mac mini: у MacHTML на Apple Silicon часто около $16.9/день с SSH/VNC для живых захватов.
Совмещайте подстройку таймаутов чтения с лимитами форков и конкурентности — см. гайд по троттлингу, чтобы ретраи не превращались в шторм.
UX каналов во время зависаний
Пользователи Slack и Teams терпят ожидание, если копия объясняет причину. Шлите шаблон после 8 с без первого токена, второй — после 45 с, финальную ссылку-эскалацию — после 120 с.
Не сыпьте сырые стеки в каналы — там могут быть внутренние хостнеймы.
Для мультиязычных команд локализуйте уведомления о задержке по заголовку локали воркспейса.
Аналитика должна разделять «нет первого токена» и «стрим остановился посреди ответа»: первое чаще про connect/auth, второе почти всегда про idle чтения или паузы чанков у апстрима.
Если есть публичный статус, добавьте синтетический бейдж, который жёлтеет, когда пробы превышают 2× базового time_starttransfer — коммуникации опережают тред в соцсетях.
Телеметрия и SLO
Экспортируйте гистограммы time_starttransfer из синтетики и сравнивайте с живыми метриками шлюза: расхождение > 25 % намекает на локальный дрейф политик.
Помечайте пробы отдельным user-agent, чтобы сетевые команды могли whitelist без широких дыр. Когда пробы зелёные, а живой трафик нет, сравните MTU и TCP window scaling между подсетью проб и продовым VPC peer — «таинственные зависания» из-за MSS всё ещё встречаются в 2026.
Безопасники спросят, не увеличивает ли более длинное окно чтения dwell time для атакующих, держащих соединения: сочетайте рост таймаута с меньшим числом одновременных потоков на тенанта.
Алертьте, если частота таймаутов чтения > 4× семидневной базы дольше 10 минут; сначала зовите сеть, не трогая маршрутизацию моделей.
Храните структурированные аудит-логи 90 дней с correlation ID между сообщением пользователя и request id провайдера.
Раз в квартал вручную просматривайте 35 самых долгих ожиданий — автоматические бакеты всё ещё путают региональные просадки с локальными багами.
Аннотируйте Grafana мерджами, трогающими константы таймаутов, чтобы пики совпадали с намеренными изменениями.
Когда статус провайдера пишет «повышенная задержность» без жёсткого фейла, временно укоротите idle для стрима, чтобы пользователь видел явный ретрай вместо бесконечного спиннера, и верните значения в течение 4 часов по чек-листу отката с привязкой к тикету.
FAQ
Таймаут чтения — это 429?
Нет: у 429 есть статус-строка; при зависании чтения терминального ответа нет.
Поднимать ли таймауты в первую очередь?
Только с тикетом, верхним пределом и таймером отката.
Зачем репетировать на физическом Mac mini?
Стек TLS, launchd и дисковое поведение macOS отличаются от Linux CI.
Mac mini на Apple Silicon остаётся самым правдоподобным полигоном для работы с таймаутами OpenClaw: предсказуемый нагрев при длинных захватах, нативная интеграция с Keychain и сетевой стек, совпадающий с продовыми шлюзами на macOS. MacHTML сдаёт облачные Mac mini с SSH/VNC, чтобы платформенные команды проверяли политики чтения, пробы doctor и троттлинг без нового CAPEX — подняли на учения, собрали доказательства, выключили после зелёного статуса.
Репетиция диагностики таймаутов OpenClaw на облачном Mac mini
Арендуйте Apple Silicon, чтобы воспроизводить зависания чтения, крутить потолки и проверять взаимодействие doctor и троттлинга на реальном macOS.