Если NIC отправляет прерывания о приходе пакетов только на одно ядро CPU, это ядро становится узким местом.
Почему Одна очередь приёма, или выключен RSS, который распределяет пакеты по нескольким ядрам → Следствие Одно ядро загружено на 100% и не успевает забирать пакеты → На экране При наплыве игроков потери и задержка на всём сервере (телепортация, задержка ввода)
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Настроить RSS (распределяет NIC) и RPS (распределяет ядро ОС), распределить прерывания по нескольким ядрам, для UDP включить распределение по очередям с учётом портов (rx-flow-hash udp4 sdfn в ethtool -N), разнести ядра обработки прерываний и ядра потоков игрового тика, следить за %soft по ядрам.
Цифры для ориентира
Через сетевой стек ядра ОС одно процессорное ядро успевает обработать примерно сотни тысяч пакетов в секунду, в зависимости от размера пакетов и настроек. Если в загрузке по ядрам доля обработки приёма (%soft в mpstat) сосредоточена на одном ядре, причина именно в этом.
На графике
Упор в лимит (плато) · %soft по ядрам, входящие пакеты в секунду
Где смотреть
Посмотреть через mpstat -P ALL 1 %soft (долю времени на обработку программных прерываний) по ядрам, через /proc/interrupts, на какие ядра идут прерывания каждой очереди NIC, через ethtool -l число очередей, через ethtool -S число пакетов по очередям (названия счётчиков зависят от драйвера)
Подтверждает
У одного ядра %soft держится около 100%, остальные простаивают, прерывания и пакеты скапливаются в одной очереди. С этого момента число входящих пакетов в секунду перестаёт расти
Опровергает
Если %soft ровно распределён по ядрам, причина в другом. Если CPU простаивает, а потери есть, это «Превышен лимит PPS в облаке» или «Слишком маленький кольцевой буфер»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Даже при нескольких очередях трафик скапливается в одной, если почти весь он приходит с немногих адресов, например от шлюзов или прокси. Для UDP NIC по умолчанию иногда распределяет пакеты по очередям только по адресам, и чтобы нагрузка распределилась равномерно, нужно включить учёт портов.
Источники
Scaling in the Linux Networking StackLinux kernel RSS (NIC распределяет пакеты по нескольким очередям приёма) и RPS (распределяет ядро ОС), настройка с отдельным прерыванием на каждую очередь и распределением по ядрам, если узкое место в обработке прерываний приёма, рекомендуется RSS
How to receive a million packets per secondCloudflare Замеры, в которых при одной очереди приёма на одно ядро это ядро упиралось примерно в 350–430 тыс. пакетов в секунду, случай, когда NIC хешировал UDP только по IP-адресам и весь трафик шёл в одну очередь