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

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

Слишком маленький кольцевой буфер RX ring buffer overflow

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

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

Если кольцевой буфер, где NIC ненадолго держит пакеты, маленький, при резком наплыве пакетов он переполняется, и пакеты отбрасываются.

Почему Кольцевой буфер оставлен маленьким, со значением по умолчанию (256–2 048 слотов в зависимости от драйвера) → Следствие Во время всплеска трафика буфер переполняется раньше, чем CPU успевает забрать пакеты → На экране Потери только в моменты всплесков (телепортация, съеденные умения). В логах игрового сервера следов нет

Симптомы
Телепортация, Съеденные действия / роллбэк
Факторы
Потери
У кого
Весь сервер
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Увеличить кольцевой буфер (ethtool -G), следить за счётчиками отбрасываний (rx_missed_errors и другие в ethtool -S, названия зависят от драйвера).
Цифры для ориентира
При потоке 1 млн пакетов в секунду 1 024 слота заполняются примерно за 1 ms. Достаточно CPU один раз опоздать за это время, и буфер переполнится. У большинства NIC буфер можно увеличить до нескольких тысяч слотов.
На графике
Случайные всплески · счётчик отбрасываний при приёме в NIC
Где смотреть
Собирать с коротким интервалом счётчики отбрасываний при приёме из ethtool -S (rx_missed_errors, rx_fifo_errors и т. п., названия зависят от драйвера) и missed из ip -s -s link, через ethtool -g проверить текущий и максимальный размер кольцевого буфера
Подтверждает
В моменты всплесков счётчики отбрасываний растут, а текущий размер буфера намного меньше максимального. После увеличения буфера отбрасываний становится меньше
Опровергает
Если счётчики отбрасываний не меняются, а потери есть, дело на следующем этапе в ядре ОС («Нехватка буферов сокетов в ядре») или на сетевом участке. Если %soft одного ядра 100%, это «Все прерывания NIC на одном ядре»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
    У e1000 по умолчанию 256 дескрипторов приёма (слотов кольца), можно увеличить до 4 096
  2. drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
    У драйвера ice по умолчанию 2 048 дескрипторов приёма, максимум 8 160
  3. Interface statistics Linux kernel
    Пакеты, отброшенные устройством из-за нехватки буфера, учитываются в rx_missed_errors, статистику конкретного драйвера смотреть через ethtool -S
  4. ethtool(8) — Linux manual page ethtool
    -g показывает размер кольца (текущий и максимальный), -G меняет его, -S выводит статистику драйвера

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

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

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

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