Пакеты дошли до сервера, но выбрасываются: переполнен кольцевой буфер NIC (буфер, где ненадолго лежат пришедшие пакеты) или загружено до предела процессорное ядро, на котором ОС обрабатывает приём.
Почему Резкий наплыв игроков, все прерывания на одном ядре CPU, CPU steal на виртуальной машине, перегрузка виртуального коммутатора → Следствие Отбрасывание в кольцевом буфере (rx_missed_errors и др., название зависит от драйвера) или в очереди приёма ядра (softnet dropped) → На экране Когда игроков много, на всём сервере одновременно задержка ввода и короткие фризы
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Добавить в мониторинг счётчики отбрасываний вроде rx_missed_errors из ethtool -S и dropped из /proc/net/softnet_stat, увеличить кольцевой буфер (ethtool -G), распределить RSS и прерывания по нескольким ядрам, разнести игровые потоки и ядра обработки приёма, держать запас CPU, на виртуальной машине проверить CPU steal и нагрузку виртуального коммутатора.
Цифры для ориентира
Пакеты, которые сервер получил и выбросил, повторно отправляет клиент. Поэтому в метриках повторных передач сервера проблема почти не видна и сначала проявляется в счётчиках отбрасываний вроде rx_missed_errors в ethtool -S (название зависит от драйвера) и в dropped из /proc/net/softnet_stat.
На графике
Упор в лимит (плато) · загрузка softirq по ядрам, счётчики отбрасываний NIC
Где смотреть
Посмотреть счётчики отбрасываний в ethtool -S (rx_missed_errors и др., у mlx5 rx_out_of_buffer и rx_discards_phy), missed в ip -s -s link, 2-й столбец (dropped) и 3-й столбец (time_squeeze) в /proc/net/softnet_stat, а через mpstat -P ALL посмотреть %soft (обработка программных прерываний) по ядрам. На виртуальной машине смотреть и %steal
Подтверждает
В часы наплыва игроков растут счётчики отбрасываний или softnet dropped, а %soft на ядре, обрабатывающем приём, упирается почти в 100% и выше не поднимается. На всех соединениях этого сервера одновременно запаздывает ввод
Опровергает
Если счётчики отбрасываний на сервере не меняются, а повторные передачи сосредоточены на соединениях определённого региона или провайдера, это потери на маршруте. Когда на маршруте теряются пакеты, отправленные сервером, растёт TcpRetransSegs в nstat на сервере, а эти счётчики не меняются
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
Interface statisticsLinux kernel rx_missed_errors: число пакетов, которые хост не смог принять из-за нехватки буферов (в /proc/net/dev входит в drop), смотрят через ip -s -s link
Ethtool countersLinux kernel rx_out_of_buffer (нет буфера в очереди приёма) и rx_discards_phy (отброшено из-за нехватки буфера порта) драйвера mlx5
net/core/net-procfs.cLinux kernel /proc/net/softnet_stat: по строке на CPU, значения шестнадцатеричные, 2-й столбец dropped, 3-й столбец time_squeeze
Documentation for /proc/sys/net/Linux kernel netdev_max_backlog: лимит очереди приёма, куда складываются пакеты, если они приходят быстрее, чем ядро успевает их обрабатывать
proc_stat(5) — Linux manual pageLinux man-pages steal в /proc/stat: время, когда CPU использовала другая ОС в виртуализированной среде
mpstat(1) — Linux manual pagesysstat mpstat -P ALL показывает загрузку по ядрам, %soft означает время обработки программных прерываний, %steal означает время ожидания, пока гипервизор обслуживал другой виртуальный CPU
net/ipv4/proc.cLinux kernel TcpRetransSegs в выводе nstat (RetransSegs в разделе Tcp)