linux - significa - netstat time_wait
¿Cómo elimino una conexión de socket CLOSE_WAIT? (4)
Aunque demasiado de las conexiones CLOSE_WAIT significa que hay algo mal con tu código en la primera, esto no es una buena práctica aceptada.
Puede consultar: https://github.com/rghose/kill-close-wait-connections
Lo que hace este script es enviar el ACK que la conexión estaba esperando.
Esto es lo que funcionó para mí.
He escrito un pequeño programa que interactúa con un servidor en un puerto específico. El programa funciona bien, pero:
Una vez que el programa finalizó inesperadamente, y desde esa conexión de socket se muestra en estado CLOSE_WAIT
. Si trato de ejecutar un programa, se bloquea y tengo que forzarlo a cerrar, lo que acumula aún más CLOSE_WAIT
socket CLOSE_WAIT
.
¿Hay alguna manera de eliminar estas conexiones?
Como lo describe Crist Clark .
CLOSE_WAIT significa que el extremo local de la conexión ha recibido un FIN del otro extremo, pero el sistema operativo está esperando que el programa en el extremo local cierre realmente su conexión.
El problema es que su programa ejecutándose en la máquina local no está cerrando el socket. No es un problema de sintonización de TCP. Una conexión puede permanecer (y bastante correctamente) en CLOSE_WAIT para siempre mientras el programa mantiene la conexión abierta.
Una vez que el programa local cierra el socket, el sistema operativo puede enviar el FIN al extremo remoto que lo transita a LAST_ACK mientras espera el ACK de FIN. Una vez que se recibe, la conexión finaliza y cae desde la tabla de conexiones (si su extremo está en CLOSE_WAIT, no termina en el estado TIME_WAIT).
También estoy teniendo el mismo problema con el último servidor Tomcat (7.0.40). No responde una vez por un par de días.
Para ver conexiones abiertas, puede usar:
sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT
Como se menciona en esta publicación , puede usar /proc/sys/net/ipv4/tcp_keepalive_time
para ver los valores. El valor parece estar en segundos y el valor predeterminado es 7200 (es decir, 2 horas).
Para cambiarlos, debe editar /etc/sysctl.conf
.
Open/create `/etc/sysctl.conf`
Add `net.ipv4.tcp_keepalive_time = 120` and save the file
Invoke `sysctl -p /etc/sysctl.conf`
Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time`
CLOSE_WAIT
significa que su programa todavía se está ejecutando, y no ha cerrado el socket (y el núcleo está esperando que lo haga). Agregue -p
a netstat
para obtener el pid, y luego elimínelo con más fuerza (con SIGKILL
si es necesario). Eso debería deshacerse de tus sockets CLOSE_WAIT
. También puedes usar ps
para encontrar el pid.
SO_REUSEADDR
es para servidores y zócalos TIME_WAIT
, por lo que no se aplica aquí.