Reducir el Tiempo, Reciclar y Reusar el Estado TIME_WAIT en conexión TCP

El presente instructivo tiene como finalidad presentar los pasos básicos necesarios para la configuración en el kernel de Linux del estado TIME_WAIT de conexión TCP.
Ésta configuración puede ser utilizada para optimizar las conexiones de servicios Web o Base de Datos, aunque es recomendado configurar una aplicación para el agrupamiento de conexiones (connection pooling) o en el caso del servidor WEB el Keep-Alive.

El agrupamiento de conexiones (connection pooling) permite entre otras cosas, el manejo de una colección de conexiones abiertas a una base de datos de manera que puedan ser reutilizadas al realizar múltiples consultas o actualizaciones. En el caso de los serviodres WEB (Apache), el “Keep-Alive”, permite “mantener viva” la conexión de un cliente durante algún periodo corto de tiempo.

En aplicaciones como Mysql, PostgreSQL, Oracle, entre otros entre otros suelen aperturar y cerrar conexiones a cada instante y dependiendo del número de usuarios y la demanda (peticiones por segundo), aumenta la posibilidad de sufrir degradación del servicio.

Cuando una conexión TCP se cierra activamente, el puerto DEBE permanecer en el estado de TIME-WAIT durante un tiempo de 2xMSL (Maximum Segment Lifetime), es decir 2 minutos, tiempo en el cual la conexión esta ocupada y no puede ser reutilizado inmediatamente.

A continuación esquema(Según Protocolo de Control de Transmisión RFC: 793) secuencia normal de cierre de una conexión TCP:

       TCP A                                                TCP B

  1.  ESTABLISHED                                          ESTABLISHED

  2.  (Close)
      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT

  3.  FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT

  4.                                                       (Close)
      TIME-WAIT   <--  <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ASK

  5.  TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED

  6.  (2 MSL)
      CLOSED

RFC 793. TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION. 3.5. Closing a Connection. Secuencia de cierre normal. Figura 13

Configuración

1. Verificar las conexiones TIME_WAIT

root@server:/# netstat -nat | awk '{print $6}' | sort | uniq -c
      6 CLOSE_WAIT
      1 established)
     18 ESTABLISHED
      1 Foreign
     38 LISTEN
     10 TIME_WAIT


2. Disminuir los tiempos de duración y activar el reciclado y reuso de las conexiones con estado TIME_WAIT, editar systcl

root@server:/# nano /etc/systcl.conf

Efectuar los siguientes cambios:

 # Disminuir tiempo TIME_WAIT segundos 
 net.ipv4.tcp_fin_timeout = 30

 # Activar Reciclar y reusar TIME_WAIT
 net.ipv4.tcp_tw_recycle = 1
 net.ipv4.tcp_tw_reuse = 1

3. Aplicar los cambios:

root@server:/# systcl -p /etc/sysctl.conf

4. Verificar los cambios:

root@server:/# cat /proc/sys/net/ipv4/tcp_fin_timeout
 30
root@server:/# cat /proc/sys/net/ipv4/tcp_tw_recycle
 1
root@server:/# cat /proc/sys/net/ipv4/tcp_tw_reuse
 1

Enlaces:
Reduce TIME_WAIT socket connections
Gran cantidad de conexiones TIME_WAIT
PROTOCOLO DE CONTROL DE TRANSMISIÓN DARPA INTERNET PROGRAM ESPECIFICACIÓN DE PROTOCOLOS
Análisis de conexiones TIME_WAIT
TCP Sockets: TIME_WAIT y los puertos efímeros son poco amigos
Pool de conexiones

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s