Nuestro servidor está sobrecargado con sesiones TCP / IP, tenemos 1200 - 1500 de ellas. La mayoría de ellos están suspendidos en el estado TIME_OUT. Resulta que una conexión en estado TIME_OUT ocupa un zócalo hasta que transcurran 60 segundos de tiempo de espera.
El problema es que el servidor no responde y muchos clientes no reciben servicio.
He realizado una prueba simple: descargue un archivo XML del servidor con Internet Explorer 8.0 La descarga finaliza en una fracción de segundo. Pero luego veo que la conexión TCP / IP se cuelga en el estado TIME_OUT durante 60 segundos.
¿Hay alguna forma de deshacerse de TIME_OUT esperando o hacer menos para liberar el socket para nuevas conexiones?
Entiendo por qué la conexión TCP / IP entra en el estado TIME_OUT, pero no entiendo por qué Internet Explorer no cierra la conexión una vez que finaliza la descarga del archivo XML.
Los detalles.
Nuestro servidor ejecuta un servicio web escrito en Perl (mod-perl). El servicio proporciona datos meteorológicos a los clientes. El cliente es una aplicación Flash (en realidad control Flash ActiveX integrado en la aplicación de Windows).
SO: Ubuntu
La opción Apache "Keep Alive" está establecida en 0
fuente
KeepAlive on|off
.KeepAlive 0
es la sintaxis de Apache 1.1; Supongo que no estás usando eso.Respuestas:
Esta es una configuración en su pila TCP. Como no sabemos en qué plataforma se encuentra, no podemos decir exactamente cómo se llama y cómo cambiarla.
ACTUALIZAR
Entonces estás usando Ubuntu. Puede usar
sysctl
para reducir elnet.inet.tcp.msl
valor a la mitad de laTIME_WAIT
duración deseada (en milisegundos, verman -S 4 tcp
), por ejemplosysctl net.inet.tcp.msl=2500
. Tenga cuidado con las implicaciones de hacerlo con respecto a los paquetes errantes que pueden llegar después de queTIME_WAIT
transcurre el período.fuente
Supongo que te refieres
TIME_WAIT
. El par que inicia el cierre activo es el que ingresaTIME_WAIT
(consulte el diagrama de transición de estado aquí ), por lo que si puede hacer que su cliente cierre la conexión, lo moveráTIME_WAIT
al cliente. Consulte esta respuesta para obtener más detalles y un enlace a un buen artículo sobreTIME_WAIT
problemas y cómo resolverlos.Otra alternativa, si no puede hacer que el cliente emita el cierre activo, es restablecer la conexión configurando persistente en falso antes de cerrarlo. Esto hace
RST
que se envíe un mensaje en lugar deFIN
.fuente
TIME_WAIT
es normal y, a menos que el rendimiento de su servidor se vea afectado, no es algo por lo que me preocupe demasiado. Cuando el zócalo está dentroTIME_WAIT
, toma algunos recursos, pero no significa que la conexión aún esté abierta o que el servidor todavía la esté procesando.El servidor que no responde probablemente no tiene nada que ver con la cantidad de conexiones en el estado TIME_WAIT. No está claro qué quiere decir con "ocupa un zócalo": el servidor debería tener
close
el zócalo en ese momento. El sistema debería poder manejar decenas de miles de conexiones en el estado TIME_WAIT.fuente