Agotamiento de puertos efímeros en conexiones entre servidores Ephemeral port exhaustion (TIME_WAIT)
ID de la causa so-ports · Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura)
Si el servidor del juego abre y cierra conexiones cortas con frecuencia hacia la BD u otros servidores, las conexiones cerradas siguen ocupando su puerto un tiempo y no se pueden abrir conexiones nuevas.
Por qué Se abre y se cierra una conexión nueva en cada solicitud → Efecto El lado que cierra primero retiene el puerto unos 60 segundos (en Linux) en TIME_WAIT, y se agotan los puertos disponibles → En pantalla Fallan solicitudes internas: errores al guardar y en otras funciones
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura)
Tareas (Equipo de desarrollo)
Reutilizar conexiones (pool de conexiones), no abrir y cerrar una conexión nueva en cada solicitud.
Tareas (Equipo de infraestructura)
Ampliar el rango de puertos (ip_local_port_range), evaluar la reutilización de TIME_WAIT en las conexiones salientes (tcp_tw_reuse de Linux), vigilar el número de TIME_WAIT.
Cifras de referencia
El rango de puertos predeterminado de Linux (32768–60999) tiene unos 28,000 puertos. Se agota si se abren más de 470 conexiones nuevas por segundo hacia la misma dirección de destino. Windows tiene unos 16,000 puertos por defecto (49152–65535) y un TIME_WAIT más largo, así que se agota antes.
En el gráfico
Topa con el límite · Sockets en TIME_WAIT, fallos de conexiones internas
Dónde mirar
Sockets en TIME_WAIT por dirección de destino con ss -tan state time-wait; fallos de connect (EADDRNOTAVAIL) en los logs del servidor del juego
Se confirma si
Los TIME_WAIT hacia un mismo destino (la BD, por ejemplo) se aplanan cerca del tamaño del rango de puertos efímeros (unos 28,000 por defecto) y connect falla con EADDRNOTAVAIL
Se descarta si
Si hay pocos TIME_WAIT y solo fallan las conexiones hacia el exterior: “Límites de conexiones y puertos del gateway NAT en la nube”
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
Los 60 segundos de TIME_WAIT en Linux son un valor fijo del kernel. Reducir tcp_fin_timeout, de nombre parecido, no acorta TIME_WAIT.
Fuentes
IP SysctlLinux kernel ip_local_port_range predeterminado: 32768–60999; tcp_tw_reuse; tcp_fin_timeout es el tiempo que se mantiene el estado FIN_WAIT_2
include/net/tcp.h (Linux v6.12)Linux kernel TCP_TIMEWAIT_LEN (60*HZ): TIME_WAIT, de unos 60 segundos, es una constante del kernel
TCP/IP port exhaustion troubleshootingMicrosoft Rango de puertos dinámicos predeterminado de Windows: 49152–65535; una conexión cerrada retiene el puerto en TIME_WAIT 4 minutos por defecto
ss(8) — Linux manual pageiproute2 Ver solo los sockets en TIME_WAIT con el filtro de estado state time-wait
connect(2) — Linux manual pageLinux man-pages EADDRNOTAVAIL: no se puede abrir la conexión porque todos los puertos del rango efímero están en uso