Ложные повторные передачи из-за скачков задержки Spurious RTO from delay spikes
ID причины rt-spurious-delay · Основной ответственный Внешние стороны · Внешние стороны · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка клиента
Пакет цел и лишь ненадолго сильно задерживается. Если эта задержка дольше RTO, отправитель считает пакет потерянным и передаёт его повторно.
Почему Bufferbloat, энергосбережение Wi-Fi, переключение состояний радиомодуля в мобильной сети или пауза виртуальной машины дают мгновенную задержку в сотни ms → Следствие RTO истекает раньше, происходит повторная передача, вскоре приходит и оригинал (получатель получает дубликат) → На экране Фриз и перемотку вызывает сам скачок задержки. Ложная повторная передача почти не удлиняет фриз, она только поднимает метрики повторных передач, и её принимают за потери
Основной ответственный Внешние стороны · Внешние стороны · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка клиента
Команда разработки: задачи
На клиентах с Android 10 и новее запрашивать во время игры режим Wi-Fi с низкой задержкой (блокировка Wi-Fi WIFI_MODE_FULL_LOW_LATENCY, действует, только когда экран включён и игра на переднем плане), чтобы уменьшить скачки задержки из-за энергосбережения.
Команда инфраструктуры: задачи
Избегать инстансов с burst-производительностью, не занижать сильно минимальный RTO, оставить включёнными F-RTO и временные метки (tcp_frto, tcp_timestamps), смотреть метрики повторных передач вместе с TCPSpuriousRTOs и TCPDSACKRecv из nstat, чтобы не принять их за потери.
Внешние стороны: задачи
Чтобы уменьшить сами скачки задержки, посоветовать игрокам SQM на роутере и отключение энергосбережения Wi-Fi.
Цифры для ориентира
Linux с помощью F-RTO обнаруживает ложные RTO и может отменить снижение скорости отправки. Проверяют по TCPSpuriousRTOs в nstat (сколько RTO признано ложными) и TCPDSACKRecv (сколько раз получатель сообщил «это уже получено»).
На графике
Случайные всплески · RTT (пинг), число ложных RTO
Где смотреть
Запуская nstat раз в минуту, смотреть вместе прирост TcpExtTCPTimeouts (истечения RTO), TcpExtTCPSpuriousRTOs, TcpExtTCPDSACKRecv и TcpExtTCPLostRetransmit. Если есть захват пакетов, использовать фильтр Wireshark tcp.analysis.spurious_retransmission
Подтверждает
Когда растут RTO, вместе с ними растут TcpExtTCPSpuriousRTOs или TcpExtTCPDSACKRecv, и в те же моменты RTT подскакивает до сотен ms. В захвате на стороне получателя есть и оригинал, и повторная передача
Опровергает
Если TcpExtTCPSpuriousRTOs и DSACK не меняются, а растёт TcpExtTCPLostRetransmit (потеряна и повторная передача), это реальные потери. Если RTT не скачет, а DSACK стабильно много, это «Ложные быстрые повторные передачи из-за нарушения порядка»
WifiManagerAndroid (Google) WIFI_MODE_FULL_LOW_LATENCY (API 29, Android 10): блокировка Wi-Fi с низкой задержкой, действует, только когда устройство подключено к AP, экран включён и приложение на переднем плане
net/ipv4/proc.cLinux kernel Названия счётчиков в выводе nstat: TCPTimeouts, TCPSpuriousRTOs, TCPDSACKRecv, TCPLostRetransmit
net/ipv4/tcp_timer.cLinux kernel TCPTimeouts растёт при истечении таймера повторной передачи (RTO)