Desbordamiento de la cola de conexiones pendientes (backlog) Listen backlog / SYN queue overflow
ID de la causa so-backlog · Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura), Desarrollo de cliente (Equipo de desarrollo)
Cuando decenas de miles de jugadores se conectan a la vez justo después de un mantenimiento, la cola de conexiones pendientes (backlog) del kernel se desborda y se descartan intentos de conexión.
Por qué Al terminar el mantenimiento, las conexiones llegan más rápido de lo que el servidor del juego puede aceptarlas con accept → Efecto La cola de conexiones pendientes del kernel (backlog: el menor entre el valor que el código del servidor pasa a listen y el límite del kernel) se llena → En pantalla Se descartan intentos de conexión y los reintentos se repiten: el juego no conecta o se queda en carga infinita
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura), Desarrollo de cliente (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Servidor: aumentar el valor que el código pasa a listen, evitar que el hilo que acepta conexiones se detenga por otras tareas, implantar un sistema de cola de inicio de sesión. Cliente: alargar el intervalo entre reintentos (repartidos al azar).
Tareas (Equipo de infraestructura)
Aumentar somaxconn en el kernel (solo surte efecto si también se sube el valor de listen en el código del servidor), mantener activadas las SYN cookies, vigilar el número de desbordamientos (TcpExtListenOverflows de nstat).
Cifras de referencia
El límite del kernel de Linux (somaxconn) es 4,096 por defecto desde la versión 5.4 (antes, 128), pero si el código del servidor pasa a listen un valor menor, el límite es ese valor. Cuando la cola se llena, Linux descarta las solicitudes de conexión en silencio, sin devolver error. Como el SO del cliente reenvía la solicitud varias veces, la primera al cabo de 1 segundo, el jugador lo percibe como una carga larga. Los servidores Windows devuelven una respuesta de rechazo, y el cliente muestra “Error de conexión” al momento.
En el gráfico
Avalancha tras la apertura · Desbordamientos de la cola de conexiones pendientes (ListenOverflows), intentos de conexión
Dónde mirar
Incremento de TcpExtListenOverflows y TcpExtListenDrops en nstat -az; con ss -ltn, comparar el Recv-Q (conexiones esperando accept) y el Send-Q (límite del backlog) del socket de escucha
Se confirma si
ListenOverflows sube a la hora en que se concentran las conexiones y el Recv-Q del socket de escucha se queda pegado al valor de Send-Q
Se descarta si
Si ListenOverflows no cambia, no es esta causa. Si la conexión se establece pero la carga no termina: “Avalancha de inicios de sesión y consultas N+1”; si se bloquea justo al llegar a cierto número de jugadores: “Límite de descriptores de archivo”
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Fuentes
listen(2) — Linux manual pageLinux man-pages El backlog de listen se recorta en silencio si supera somaxconn; somaxconn es 4,096 por defecto (desde 5.4; antes, 128); con la cola llena, se pueden ignorar las solicitudes y dejar que el cliente reintente
IP SysctlLinux kernel tcp_syn_retries: la solicitud de conexión (SYN) se reenvía varias veces, con una primera espera de retransmisión de 1 segundo; tcp_abort_on_overflow, desactivado por defecto (no hay respuesta de rechazo aunque la cola se desborde); tcp_syncookies, activado por defecto
listen function (winsock2.h)Microsoft En Windows, cuando la cola está llena, el cliente recibe el error WSAECONNREFUSED
SNMP counterLinux kernel TcpExtListenOverflows: veces que se descartó una solicitud de conexión (SYN) porque la cola de accept estaba llena; en ese caso, TcpExtListenDrops también sube
net/ipv4/tcp_diag.c (Linux v6.12)Linux kernel Valores Recv-Q y Send-Q de ss: en un socket de escucha, conexiones esperando accept y límite del backlog; en un socket conectado, bytes que la aplicación aún no ha leído y bytes enviados que no han recibido ACK