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

Libro blanco del lag en juegos › L7 SO del servidor (kernel)

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)

Abrir la ficha interactiva con gráficos y simulaciones →

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

Síntomas
Acción perdida / rollback, No conecta / carga infinita
Factores
Pérdida de paquetes
A quién afecta
Todo el servidor, Solo una función
Cuándo
Cuando se junta mucha gente
Responsable
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

  1. IP Sysctl Linux 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
  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
  3. TCP/IP port exhaustion troubleshooting Microsoft
    Rango de puertos dinámicos predeterminado de Windows: 49152–65535; una conexión cerrada retiene el puerto en TIME_WAIT 4 minutos por defecto
  4. ss(8) — Linux manual page iproute2
    Ver solo los sockets en TIME_WAIT con el filtro de estado state time-wait
  5. connect(2) — Linux manual page Linux man-pages
    EADDRNOTAVAIL: no se puede abrir la conexión porque todos los puertos del rango efímero están en uso

Ver también

Misma capa: L7 SO del servidor (kernel)

Causas de otras capas con el mismo síntoma (Acción perdida / rollback)

Ver la ficha interactiva con gráficos y simulaciones