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

Анатомия игровых лагов › L6 Сетевая карта сервера

Все прерывания NIC на одном ядре Single-queue NIC / no RSS

ID причины nic-irq · Основной ответственный Команда инфраструктуры · Серверная инфраструктура

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

Если 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 по умолчанию иногда распределяет пакеты по очередям только по адресам, и чтобы нагрузка распределилась равномерно, нужно включить учёт портов.

Источники

  1. Scaling in the Linux Networking Stack Linux kernel
    RSS (NIC распределяет пакеты по нескольким очередям приёма) и RPS (распределяет ядро ОС), настройка с отдельным прерыванием на каждую очередь и распределением по ядрам, если узкое место в обработке прерываний приёма, рекомендуется RSS
  2. How to receive a million packets per second Cloudflare
    Замеры, в которых при одной очереди приёма на одно ядро это ядро упиралось примерно в 350–430 тыс. пакетов в секунду, случай, когда NIC хешировал UDP только по IP-адресам и весь трафик шёл в одну очередь
  3. ethtool(8) — Linux manual page ethtool
    Опция ethtool -N rx-flow-hash udp4, которая добавляет в хеш UDP порты (f, n)
  4. mpstat(1) — Linux manual page sysstat
    %soft: доля времени CPU на обработку программных прерываний, с -P ALL по каждому ядру

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

Тот же слой: L6 Сетевая карта сервера

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

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