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

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

Переполнение неглубоких буферов всплесками отправки Sender bursts overflow shallow buffers

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

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

Когда сервер каждый тик разом выплёскивает обновления для тысяч игроков, маленький буфер коммутатора или мгновенный лимит облака переполняется меньше чем за 1 ms, и часть пакетов выбрасывается.

Почему В начале тика пакеты для всех игроков отправляются разом → Следствие Мгновенно переполняется буфер порта коммутатора, где сходится трафик нескольких серверов (от сотен KB до нескольких MB на порт), или лимит облачного инстанса (средняя загрузка при этом низкая) → На экране Телепортация и короткие фризы сразу у многих игроков, по средним метрикам причину не видно

Симптомы
Телепортация, Фриз, Перемотка
Факторы
Потери
У кого
Одна локация или канал, Весь сервер
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда инфраструктуры · Сетевая инфраструктура
Команда разработки: задачи
Распределять отправку одного тика по всему тику (наплыв тысяч соединений в начале тика пейсинг по соединениям почти не сглаживает), разносить момент начала тика по серверам, для соединений с большими объёмами ограничивать скорость через SO_MAX_PACING_RATE.
Команда инфраструктуры: задачи
Серверы и ОС: ограничить общую скорость отправки сервера (шейпер в ОС сервера, tc в Linux), выплески одного соединения выравнивать пейсингом (очередь fq в Linux, BBR). Сеть: коммутаторы с большими буферами, проверять счётчики выходных отбрасываний на портах коммутаторов с коротким интервалом (по средней загрузке их не видно).
Цифры для ориентира
Порт 10 Gbps за 1 ms отправляет около 1,25 MB. Если тики нескольких серверов совпадают и их трафик сходится в один порт, буфер заполняется мгновенно.
На графике
Растёт вслед за онлайном и нагрузкой · выходные отбрасывания на портах коммутатора, доля повторных передач
Где смотреть
С интервалом в несколько секунд собирать выходные отбрасывания (ifOutDiscards) на порту коммутатора, к которому подключён сервер, и на порту уровнем выше, в облаке смотреть bw_out_allowance_exceeded и pps_allowance_exceeded в ethtool -S. Собрать повторные передачи за то же время через bcc tcpretrans и сопоставить
Подтверждает
Средняя загрузка по минутам низкая, но растут выходные отбрасывания или превышения allowance, и их число растёт вместе с онлайном и числом игроков в одном месте. Повторные передачи возникают в один и тот же момент на многих соединениях этого сервера и не привязаны к диапазонам IP определённых игроков (провайдер, регион)
Опровергает
Если на том же порту растут и ошибки CRC и ошибки приёма, это «Физические ошибки (неисправные кабели, оптические модули и разъёмы)». Если на принимающем сервере растут счётчики отбрасываний NIC или softnet dropped, это «Отбрасывание пакетов на принимающем сервере»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Пейсинг работает для каждого соединения отдельно. Наплыв, когда тысячи соединений в начале тика отправляют по одному-два пакета, пейсинг по соединениям почти не сглаживает, и игровому серверу приходится самому распределять моменты отправки. Зато когда одно соединение отправляет большой объём, NIC нарезает десятки KB данных на пакеты и отправляет их подряд (TSO), и такие выплески пейсинг распределяет хорошо.

Источники

  1. High-Resolution Measurement of Data Center Microbursts Meta
    Больше 70% всплесков на коммутаторах стоек в ЦОД заканчиваются за десятки µs, связь между средней загрузкой за минуту и дропами слабая (IMC 2017)
  2. tc-fq(8) — Linux manual page iproute2
    Очередь fq делает пейсинг для каждого сокета (соединения), SO_MAX_PACING_RATE задаёт максимальную скорость соединения
  3. net/ipv4/tcp_bbr.c Linux kernel
    BBR задаёт pacing_rate по оценке пропускной способности узкого места
  4. IP Sysctl Linux kernel
    TCP подбирает размер кадра TSO под скорость потока (максимум 64 KB, tcp_min_tso_segs)
  5. Monitor network performance for ENA settings on your EC2 instance AWS
    bw_out_allowance_exceeded и pps_allowance_exceeded: число пакетов, поставленных в очередь или отброшенных из-за превышения лимитов инстанса по пропускной способности и пакетам в секунду
  6. RFC 2863: The Interfaces Group MIB IETF
    ifOutDiscards: число исходящих пакетов, отброшенных без отправки, хотя ошибок не обнаружено (например, чтобы освободить место в буфере)
  7. Demonstrations of tcpretrans, the Linux eBPF/bcc version IO Visor
    Для каждой повторной передачи выводит строку с адресом и портом другой стороны и состоянием соединения

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

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

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

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