한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › Первопричины повторных передач TCP

Неподходящая настройка RTO RTO min too low or too high

ID причины rt-rto-setting · Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если слишком занизить минимальный RTO, от малейшей задержки возникают ложные повторные передачи, а значение по умолчанию (200 ms) для игры слишком велико, и каждая потеря даёт долгий фриз.

Почему Минимальный RTO сильно занижен под ЦОД, или на интернет-участке оставлено значение по умолчанию → Следствие Если мало, лавина повторных передач даже от мгновенной задержки, если много, долгое ожидание при каждой потере → На экране При значении по умолчанию каждая потеря даёт фриз на сотни ms, потом перемотку. Если слишком занизить, фризы короче, но резко растут ложные повторные передачи и линия связи загружается зря

Симптомы
Фриз, Перемотка, Задержка ввода
Факторы
Задержка
У кого
Весь сервер
Когда
Всегда
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
В Linux 6.15 и новее рассмотреть снижение потолка RTO для игровых соединений через TCP_RTO_MAX_MS (время до отказа от соединения тоже сокращается, поэтому вместе с этим задать время признания обрыва через TCP_USER_TIMEOUT), снижать минимальный RTO опцией сокета TCP_RTO_MIN_US (6.15 и новее) только для внутренних соединений между серверами, рассмотреть опцию сокета TCP_THIN_LINEAR_TIMEOUTS, чтобы только у игровых соединений RTO не удваивался при серии таймаутов.
Команда инфраструктуры: задачи
Снижать rto_min по маршрутам только для внутренних соединений между серверами, на интернет-участке оставить значение по умолчанию и компенсировать настройками RACK-TLP и thin stream (tcp_thin_linear_timeouts).
Цифры для ориентира
В Linux RTO = время пути туда и обратно + max(200 ms, разброс RTT×4). После каждой неудачи удваивается, максимум 120 с. В Linux 6.15 и новее этот потолок можно снизить до 1 с через TCP_RTO_MAX_MS.
На графике
Высоко с самого начала · RTO по соединениям, число ложных RTO
Где смотреть
Посмотреть настройку минимального RTO на сервере (rto_min в ip route show, в Linux 6.11 и новее sysctl net.ipv4.tcp_rto_min_us), rto и rtt в ss -ti и прирост TcpExtTCPSpuriousRTOs в nstat
Подтверждает
На сервере с заниженным минимумом rto интернет-соединений вплотную прижат к rtt, и TcpExtTCPSpuriousRTOs сильно растёт. При значении по умолчанию rto игровых соединений больше rtt на 200 ms и более, и каждая потеря даёт фриз на это время
Опровергает
Если rto соответствует расчёту по умолчанию (около rtt + 200 ms) и ложных RTO мало, но фризы необычно долгие, дело в сериях потерь или способе восстановления («Медленное восстановление потерь в thin stream», «Удаление опций TCP промежуточным оборудованием»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    RTO = SRTT + max(G, 4·RTTVAR), рекомендован минимум 1 с, после каждой неудачи удвоение, максимум, если его вводят, не меньше 60 с
  2. include/net/tcp.h Linux kernel
    В Linux TCP_RTO_MIN 200 ms, TCP_RTO_MAX 120 с
  3. net/ipv4/tcp_input.c Linux kernel
    В Linux RTO = SRTT + rttvar, и rttvar не опускается ниже минимального RTO (по умолчанию 200 ms)
  4. tcp: add the ability to control max RTO Linux kernel
    Добавлена опция сокета TCP_RTO_MAX_MS (1–120 с), начиная с Linux 6.15
  5. tcp: add sysctl_tcp_rto_min_us Linux kernel
    Добавлен общий для сервера минимальный RTO по умолчанию tcp_rto_min_us, начиная с Linux 6.11
  6. tcp: support TCP_RTO_MIN_US for set/getsockopt use Linux kernel
    Добавлена опция сокета TCP_RTO_MIN_US, задающая минимальный RTO для каждого сокета, начиная с Linux 6.15
  7. IP Sysctl Linux kernel
    tcp_rto_min_us по умолчанию 200000 (приоритет у опции маршрута rto_min и опции сокета TCP_RTO_MIN_US), tcp_rto_max_ms от 1 000 до 120 000 (по умолчанию 120 000), tcp_thin_linear_timeouts
  8. ip-route(8) — Linux manual page iproute2
    Опция маршрута rto_min: минимальный RTO при обмене с этим адресатом
  9. Thin-streams and TCP Linux kernel
    TCP_THIN_LINEAR_TIMEOUTS позволяет отключить экспоненциальную задержку повтора только для соединений thin stream
  10. tcp(7) — Linux manual page Linux man-pages
    TCP_USER_TIMEOUT: сколько ждать подтверждения данных, прежде чем закрыть соединение
  11. ss(8) — Linux manual page iproute2
    rto (ms) и rtt в ss -i
  12. SNMP counter Linux kernel
    TcpExtTCPSpuriousRTOs: ложные RTO, обнаруженные F-RTO

Смотрите также

Тот же слой: Первопричины повторных передач TCP

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами