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)
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
Scaling in the Linux Networking StackLinux 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
How to receive a million packets per secondCloudflare 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
ethtool(8) — Linux manual pageethtool La opción ethtool -N rx-flow-hash udp4, que añade los puertos (f y n) al hash de UDP
mpstat(1) — Linux manual pagesysstat %soft: proporción del tiempo de CPU dedicada a procesar interrupciones de software; por núcleo con -P ALL