2.3 KiB
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
Ответы на вопросы
- conntrack + hostPort: косвенно (INVALID на out-of-window ретрансмиты), но корень — MTU
- NodePort/LoadBalancer: не лечит, DNAT-слой остаётся
- WebSocket: даёт эффект keep-alive (80%), не 100%
- Тюнинг: MSS clamping +
nf_conntrack_tcp_be_liberal=1+ Cilium MTU
План подтверждения
- MSS clamp 1360 → тест 100KB×10 снаружи → если 100% = MTU подтверждён
ping -M do -s 1472вниз по размеру — найти где рвётсяconntrack -S,nstat,dmesg- Cilium: tunnel mode? pod MTU vs tunnel MTU
iptables -t mangle -L— есть ли уже TCPMSS/DROP INVALID?