Solución:
CLOSE_WAIT
significa que su programa aún se está ejecutando y no ha cerrado el socket (y el kernel está esperando que lo haga). Agregar -p
para netstat
para obtener el pid, y luego matarlo con más fuerza (con SIGKILL
si es necesario). Eso debería deshacerse de tu CLOSE_WAIT
enchufes. También puedes usar ps
para encontrar el pid.
SO_REUSEADDR
es para servidores y TIME_WAIT
sockets, por lo que no se aplica aquí.
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 que se ejecuta en la máquina local no cierra el socket. No es un problema de ajuste de TCP. Una conexión puede (y correctamente) permanecer en CLOSE_WAIT para siempre mientras el programa mantiene abierta la conexión.
Una vez que el programa local cierra el socket, el sistema operativo puede enviar el FIN al extremo remoto que lo cambia a LAST_ACK mientras espera el ACK del FIN. Una vez que se recibe, la conexión finaliza y se desconecta de la tabla de conexiones (si su extremo está en CLOSE_WAIT, lo hace no terminan en el estado TIME_WAIT).
También tengo el mismo problema con un servidor Tomcat más reciente (7.0.40). No responde una vez durante un par de días.
Para ver las 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, debes 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`