Files
loadtest/History/2026-07-10-opus-answer.md
T
naeel 91d717585a
Deploy loadtest / validate (push) Waiting to run
fix: debug=False, force read body, bump 1.0.6→1.0.7
2026-07-10 22:59:56 +04:00

2.3 KiB

2026-07-10 — Ответ Опуса: MTU/MSS «чёрная дыра»

Диагноз

PMTU Discovery сломан на edge LB + ECMP-балансировка. Не размерный лимит — MTU-дыра на части TCP-путей.

Почему не лимит

  • 50KB , 52KB , 100KB иногда — случайность, а не порог
  • Лимит дал бы детерминированный сбой
  • Случайность = зависимость от пути (ECMP), не от размера

Почему keep-alive = 80%

Одно соединение «прилипает» к одному backend-пути (ECMP hash по 5-tuple). Попал на хороший путь — всё работает. Новый коннект = новый хэш = рулетка (~50% плохих путей).

Почему маленькие тела проходят

Не требуют длинной серии full-MSS сегментов — MTU-дыра не успевает сработать.

Корень

Edge LB раскидывает TCP-коннекты по нескольким путям. На части путей ICMP frag-needed (type 3 code 4) режется → PMTU Discovery сломан → full-MSS сегменты молча дропаются → таймаут.

Что сработало бы

# MSS clamping на ноде — сегменты не превышают безопасный MTU
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360

Ответы на вопросы

  1. conntrack + hostPort: косвенно (INVALID на out-of-window ретрансмиты), но корень — MTU
  2. NodePort/LoadBalancer: не лечит, DNAT-слой остаётся
  3. WebSocket: даёт эффект keep-alive (80%), не 100%
  4. Тюнинг: MSS clamping + nf_conntrack_tcp_be_liberal=1 + Cilium MTU

План подтверждения

  1. MSS clamp 1360 → тест 100KB×10 снаружи → если 100% = MTU подтверждён
  2. ping -M do -s 1472 вниз по размеру — найти где рвётся
  3. conntrack -S, nstat, dmesg
  4. Cilium: tunnel mode? pod MTU vs tunnel MTU
  5. iptables -t mangle -L — есть ли уже TCPMSS/DROP INVALID?