Голосовые системы

chat-agent: стоимость healthcheck · 06.10.2026

После C3 заметную часть CPU в простое тратили три периодические health-пробы. Каждые 10 секунд они запускали Python для одного локального HTTP-запроса. Теперь Core, WebRTC ingress и WSS ingress вызывают curl. В одинаковых трёхминутных окнах расход CPU всего стэка снизился примерно на 75%.

Это продолжение приёмки C3. Диалог, ASR, аудиоконтракты и соседние сервисы не перерабатывались повторно.

Код, CI и фактические контейнеры

Исходники: 0c403307. Pipeline 4934: Python 9910, frontend 9911, Ruby 9912, integration 9913 и выборочная сборка 9915 завершились успешно. Опубликованы только Core и два ingress.

Registry listener обновил эти три контейнера. Insight подтвердил у каждого revision 0c403307, healthy и update completed. Повторный Insight U и полный deploy не запускались. Остальные десять container IDs сохранились; все 13 сервисов running, OOM/restart count — ноль. Frontend и Ruby имеют revision документирующей поставки 27432de7; Agent, API и LLM — e9122e0. Image ID ниже — config identity Docker, а не registry manifest digest.

Сервис Actual image config ID Rootfs до → после, байт
Core sha256:c4c3906c6310f29f34b05ed4d2d93c5f0661b6ba94f1d8c4427a4b1c55ea5629 325 268 232 → 318 527 416
WebRTC ingress sha256:10a3a8ed2d259aa20614ac84afb408bbe603b833ce0b286e623cff426c7c8a88 380 131 574 → 385 635 305
WSS ingress sha256:f4b6c1eafd91e76604184fde803d5139e7dda65690ddebef7c3acf11e7a15e84 351 291 258 → 356 794 989

Проверка осталась строгой

Успех означает полностью полученный HTTP 200 от локального /healthz. 503, redirect, отказ соединения, зависшие headers и зависший body после headers 200 дают отказ. Proxy environment игнорируется; тело ответа не выводится. Core учитывает CORE_PORT, ingress используют порт 8000. NATS readiness в обработчиках /healthz сохранена. Docker interval/timeout/start-period/retries: 10 с / 3 с / 20 с / 3; HTTP deadline — 2 с.

Исходники: Core Dockerfile, ingress Dockerfile, проверка точной команды. Fixture выполняется при сборке каждого образа через временный bind mount и не остаётся в runtime layer. В обеих Compose-конфигурациях добавлен этот build context; удалён повторный ключ имени dev PostgreSQL-тома, который мешал docker compose config. Production DRS и тома этой правкой не менялись.

В каждом реальном образе выполнено 30 CPU-проб. RUSAGE_CHILDREN учитывает полное дерево shell/curl, а не только родительский shell. Порог 50 мс выдержан во всех 90 измерениях. Дополнительно прошли перечисленные случаи отказов, проверка порта и игнорирования proxy.

Образ CPU mean / p95 / max одной пробы, мс n
Core 19,145 / 23,590 / 27,292 30
WebRTC ingress 18,710 / 23,812 / 25,443 30
WSS ingress 21,146 / 26,112 / 28,948 30

Прежний диагностический mean Core — 490,520 мс CPU. Число образцов старого замера не сохранено в этом отчёте; это ориентир причины, а не симметричная статистическая серия. Основное сравнение результата — container CPU ниже.

Замеры до и после

Источник — VictoriaMetrics через Grafana gis-master. Оба окна по 180 с, 13 точек с шагом 15 с, CPU rate 60 с. Namespace chat-agent, 13 сервисов; active и pending во всех точках равны нулю. После тестов выдержана минута перед началом нового окна. Данные и точные запросы: числовой evidence.

Показатель всего стэка в простое До, 12:22:16–12:25:16 UTC После, 12:43:27–12:46:27 UTC Изменение
CPU mean, ядра 0,19718 0,04930 −75,0%
CPU max, ядра 0,22213 0,06691 −69,9%
Working set mean, МБ 547,57 553,41 +1,1%
Working set max, МБ 547,59 558,32 +2,0%
Сумма rootfs 13 образов, МБ 3 251,98 3 256,25 +4,27 МБ / +0,13%

МБ десятичные. RAM этой правкой не сократилась. Rootfs — весь результат пересборки, включая слои зависимостей; это не изолированный вес пакета curl. Общие layers в сумме повторяются, тома и внешние модели не входят.

Свежий compressed delta не подтверждён: Registry Explorer /index возвращал ERR_CONNECTION_CLOSED, чтение /json завершалось timeout. Доступ не обходился. Точное сравнение compressed/unique layers C0 → corpus C3 остаётся в датированном отчёте C3; его нельзя выдавать за размеры новых C4 images. Rootfs текущего полного состава подтверждён Insight.

Сопоставление CPU относится к двум окнам простоя перед/после C4. Это не load SLO и не сравнение с C0, у которого равнозначного CPU-окна не было. Производственный код сохранил 22 358 строк, активный — 15 890. Fixture добавил 124 строки operations: 1 223 → 1 347; весь считаемый Git-код — 28 218 → 28 342. Правила подсчёта прежние: physical tracked lines; YAML, JSON, Dockerfiles и inline HTML не входят. Итоговый rootfs C0 → C4: 3 685,21 → 3 256,25 МБ (−11,6%).

Короткая проверка пользовательского пути

После обновления выполнены один текстовый запрос, один RTC и один WSS с тем же WAV 3,025 с, что в C3. После речи продолжался silent PCM. Это smoke, n=1 на сценарий; полную контрольную серию и приёмку неизменённого voice повторно не запускали. Их результаты сохраняются в C3.

  • Текст: HTTP 200/DONE, верный ответ «4», 4,180 с, две записи истории.
  • RTC: SDP → connected 1,583 с; srflx → relay, DTLS connected, 1 948 наблюдённых RTP packets, decoded first PCM, пять partial spans, final, одна LLM generation, DONE и две записи истории.
  • WSS: ready 0,343 с, без RTC peer; 3 577 наблюдённых chunks / 7 325 696 PCM bytes, first PCM, четыре partial spans, final, одна generation, DONE и две записи истории.
  • UI показал ответы и отключение обоих потоков. Временные media/fetch hooks восстановлены; в idle-окне активных работ не осталось.

Связанные traces: RTC 81d480d14214b77989b7d9bd908702f7, WSS db8dbf9011741f21fb067b9cb26ec2ae. Browser event cursor WSS был усечён; partial/final подтверждены свежими Tempo spans и итогом в UI/history, а не заявлением о полном replay браузерных событий.

Оба аудиораспознавания были неточными и привели к уточнению. Исправление healthcheck не улучшает WER/DER; физический микрофон этой синтетической пробой не проверен. Voice/H100/Ollama/TURN/OAuth/platform не менялись. Отложенные проблемы voice, per-user NATS ACL, ICE restart и несколько media owners остаются указанными в C3. OpenWiki пропущен по явному решению пользователя.

Исходник

Скачать Markdown · К материалам исследования