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

Libro blanco del lag en juegos › L6 Tarjeta de red del servidor

Interrupciones de la NIC concentradas en un solo núcleo Single-queue NIC / no RSS

ID de la causa nic-irq · Responsable principal Infraestructura de servidores (Equipo de infraestructura)

Abrir la ficha interactiva con gráficos y simulaciones →

Si la NIC envía las interrupciones de llegada de paquetes a un solo núcleo de CPU, ese núcleo se convierte en el cuello de botella.

Por qué Hay una sola cola de recepción o está desactivado RSS, que reparte los paquetes entre varios núcleos → Efecto Un núcleo llega al 100% y no saca los paquetes a tiempo → En pantalla Pérdida y latencia en todo el servidor cuando se junta mucha gente (teletransporte, input lag)

Síntomas
Teletransporte, Rubber banding, Input lag
Factores
Pérdida de paquetes, Latencia
A quién afecta
Todo el servidor
Cuándo
Cuando se junta mucha gente
Responsable
Responsable principal Infraestructura de servidores (Equipo de infraestructura)
Tareas (Equipo de infraestructura)
Configurar RSS (reparto en la NIC) y RPS (reparto en el kernel), repartir las interrupciones entre varios núcleos, hacer que en UDP la cola se elija mirando también los puertos (rx-flow-hash udp4 sdfn de ethtool -N), separar los núcleos que atienden interrupciones de los del hilo del tick del juego, vigilar el %soft por núcleo.
Cifras de referencia
Un núcleo puede procesar a través del kernel aproximadamente cientos de miles de paquetes por segundo, según el tamaño de los paquetes y la configuración. Si en la utilización por núcleo la parte del procesamiento de recepción (%soft de mpstat) se concentra en un solo núcleo, es este caso.
En el gráfico
Topa con el límite · %soft por núcleo, paquetes recibidos por segundo
Dónde mirar
Ver el %soft (proporción de tiempo dedicada a procesar interrupciones de software) por núcleo con mpstat -P ALL 1, a qué núcleo van las interrupciones de cada cola de la NIC en /proc/interrupts, el número de colas con ethtool -l y los paquetes por cola con ethtool -S (los nombres cambian según el driver)
Se confirma si
Un solo núcleo tiene el %soft pegado cerca del 100% mientras los demás están libres, y las interrupciones y los paquetes se concentran en una cola. A partir de ahí, los paquetes recibidos por segundo ya no suben más
Se descarta si
Si el %soft está repartido de forma uniforme entre los núcleos, no es esta causa. Si la CPU está libre y hay pérdida, apunta a “Límite de PPS de la nube superado” o “Búfer circular (ring buffer) insuficiente”
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
Aunque haya varias colas, si casi todo el tráfico viene de unas pocas direcciones, como gateways o proxies, se concentra en una sola cola. En UDP, algunas NIC eligen la cola por defecto mirando solo las direcciones, y el tráfico solo se reparte de forma uniforme al cambiarlo para que mire también los puertos.

Fuentes

  1. Scaling in the Linux Networking Stack Linux kernel
    RSS (la NIC reparte entre varias colas de recepción) y RPS (reparte el kernel), configuración que da a cada cola su propia interrupción y las reparte entre núcleos; se recomienda RSS cuando el cuello de botella es el procesamiento de las interrupciones de recepción
  2. How to receive a million packets per second Cloudflare
    Mediciones en las que una cola de recepción atendida por un solo núcleo se atascaba en unos 350,000–430,000 paquetes por segundo; caso en que la NIC aplicaba el hash a UDP solo por dirección IP y todo se concentraba en una cola
  3. ethtool(8) — Linux manual page ethtool
    La opción ethtool -N rx-flow-hash udp4, que añade los puertos (f y n) al hash de UDP
  4. mpstat(1) — Linux manual page sysstat
    %soft: proporción del tiempo de CPU dedicada a procesar interrupciones de software; por núcleo con -P ALL

Ver también

Misma capa: L6 Tarjeta de red del servidor

Causas de otras capas con el mismo síntoma (Teletransporte)

Ver la ficha interactiva con gráficos y simulaciones