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), и такие выплески пейсинг распределяет хорошо.
tc-fq(8) — Linux manual pageiproute2 Очередь fq делает пейсинг для каждого сокета (соединения), SO_MAX_PACING_RATE задаёт максимальную скорость соединения
net/ipv4/tcp_bbr.cLinux kernel BBR задаёт pacing_rate по оценке пропускной способности узкого места
IP SysctlLinux kernel TCP подбирает размер кадра TSO под скорость потока (максимум 64 KB, tcp_min_tso_segs)
RFC 2863: The Interfaces Group MIBIETF ifOutDiscards: число исходящих пакетов, отброшенных без отправки, хотя ошибок не обнаружено (например, чтобы освободить место в буфере)