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

Анатомия игровых лагов › Первопричины повторных передач TCP

Отбрасывание пакетов на принимающем сервере Receiver host drops (ring, softirq, CPU)

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

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

Пакеты дошли до сервера, но выбрасываются: переполнен кольцевой буфер 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 на сервере, а эти счётчики не меняются
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. Interface statistics Linux kernel
    rx_missed_errors: число пакетов, которые хост не смог принять из-за нехватки буферов (в /proc/net/dev входит в drop), смотрят через ip -s -s link
  2. drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
    Названия счётчиков ethtool -S задаёт драйвер (например, rx_missed_errors и rx_no_buffer_count у igb)
  3. Ethtool counters Linux kernel
    rx_out_of_buffer (нет буфера в очереди приёма) и rx_discards_phy (отброшено из-за нехватки буфера порта) драйвера mlx5
  4. net/core/net-procfs.c Linux kernel
    /proc/net/softnet_stat: по строке на CPU, значения шестнадцатеричные, 2-й столбец dropped, 3-й столбец time_squeeze
  5. Documentation for /proc/sys/net/ Linux kernel
    netdev_max_backlog: лимит очереди приёма, куда складываются пакеты, если они приходят быстрее, чем ядро успевает их обрабатывать
  6. Scaling in the Linux Networking Stack Linux kernel
    RSS: NIC распределяет пакеты по нескольким очередям приёма, и их обрабатывают несколько CPU
  7. ethtool(8) — Linux manual page ethtool
    -G (--set-ring) меняет размер кольцевого буфера
  8. proc_stat(5) — Linux manual page Linux man-pages
    steal в /proc/stat: время, когда CPU использовала другая ОС в виртуализированной среде
  9. mpstat(1) — Linux manual page sysstat
    mpstat -P ALL показывает загрузку по ядрам, %soft означает время обработки программных прерываний, %steal означает время ожидания, пока гипервизор обслуживал другой виртуальный CPU
  10. net/ipv4/proc.c Linux kernel
    TcpRetransSegs в выводе nstat (RetransSegs в разделе Tcp)

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

Тот же слой: Первопричины повторных передач TCP

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

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