Резкий спад передачи из-за управления перегрузкой Congestion control backoff
ID причины sk-congestion · Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
TCP считает потери признаком перегрузки и снижает скорость передачи на 30–50%. Точно так же он реагирует и на потери в Wi-Fi.
Почему Когда отправлять нужно много, в Wi-Fi или на линии случаются небольшие потери → Следствие TCP резко снижает скорость передачи и восстанавливает её медленно (CUBIC, алгоритм по умолчанию в Linux и Windows, снижает на 30%) → На экране В людных местах обновления отстают: перемотка, задержка ввода
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Сократить объём отправки (зона интереса, только изменения), отправлять порциями, не всё разом.
Команда инфраструктуры: задачи
Перейти на другой алгоритм управления перегрузкой, например BBR (tcp_congestion_control).
На графике
Пила: плавный рост и резкий сброс · окно перегрузки (cwnd) и скорость передачи по соединениям
Где смотреть
Несколько раз снять ss -ti для соединения игрока с отстающими обновлениями и посмотреть, как меняются cwnd и ssthresh, какой алгоритм управления перегрузкой используется (cubic, bbr) и копится ли Send-Q
Подтверждает
После потерь cwnd раз за разом резко падает и медленно растёт снова, а пока он мал, копится Send-Q, и это совпадает по времени с жалобами на перемотку и задержку ввода
Опровергает
Если cwnd достаточный, а обновления всё равно отстают, дело в окне приёма («Нулевое окно (остановка, похожая на повторную передачу)») или в отправке на сервере
IP SysctlLinux kernel tcp_congestion_control выбирает алгоритм управления перегрузкой для новых соединений
ss(8) — Linux manual pageiproute2 cwnd, ssthresh и название алгоритма управления перегрузкой в выводе -i
net/ipv4/tcp_diag.c (Linux v6.12)Linux kernel Значения Recv-Q и Send-Q в ss: у слушающего сокета это число подключений, ждущих accept, и лимит backlog, у подключённого сокета это байты, ещё не прочитанные приложением, и отправленные байты без ACK