Files
loadtest/History/2026-07-11-ws-stall-final.md
naeel c1faa60a37
Deploy loadtest / validate (push) Waiting to run
docs: WS 51s stall final diagnosis, bump 1.0.18
2026-07-11 07:49:07 +04:00

2.8 KiB
Raw Permalink Blame History

2026-07-11 — Диагностика WebSocket 51s stall: итог

Проблема

WebSocket-загрузка файлов через ingress (Flask + flask-sock + Werkzeug). Файлы >1 MB: ~20-30% соединений быстрые (~0.5с), ~70-80% — 51 секунда. Задержка не зависит от размера файла (2MB и 4MB — одинаково 51с).

Что проверено (полный список)

Код приложения

Изменение Результат
Baseline (без flow control) ~20% fast
bufferedAmount flow control ~20% (затык на 20% вместо 90%)
Server-side ACK (чанк→ack→след) 0% (сломано полностью)
Возврат к baseline ~20% fast

Платформа (Shturval + Cilium)

Изменение Результат
nodeSelector (под = нода с ingress) ~20% fast
Scale ingress до 4 (на всех нодах) ~20% fast
hostNetwork на python поде ~20% fast
keepalive=0 к upstream ~30% fast

Конфигурация nginx (ingress)

  • proxy_buffering off, proxy_request_buffering off
  • proxy_send_timeout 600s, proxy_read_timeout 600s
  • ModSecurity OWASP CRS 4.10 (DetectionOnly)
  • client_body_buffer_size 2m
  • Без limit_rate, без limit_req

Сеть

  • Cilium Geneve tunnel mode, kube-proxy replacement
  • kube-vip ARP mode на всех 4 нодах
  • enable-host-legacy-routing: true

Ключевой тест

5×2MB через VIP с моей машины (CLI, не браузер):

#0: total=52.2s sent=52.0s resp=0.2s
#1: total=0.7s  sent=0.6s  resp=0.1s  ← FAST
#2: total=50.8s sent=50.6s resp=0.2s
#3: total=52.3s sent=52.1s resp=0.2s
#4: total=51.9s sent=51.8s resp=0.1s

Задержка в фазе send() — клиент блокируется при отправке данных. TCP backpressure: где-то в цепочке буфер переполняется и не дрейнуется.

Вывод

Проблема на стороне платформы (Shturval/nginx-ingress/Cilium), не приложения.

51-секундная задержка константна, не зависит от:

  • Размера файла
  • Node placement
  • Cilium Geneve vs hostNetwork
  • Количества ingress реплик
  • keepalive к upstream

Единственный стабильный метод: HTTP POST (но Werkzeug рвёт соединение в 30-50% случаев).

Текущее состояние

  • Код: baseline v1.0.18 (без flow control, без ACK)
  • Кластер: все изменения откачены
  • WebSocket работает, но с 51-секундной паузой в 70-80% случаев