Comment puis-je supprimer une connexion CLOSE wait socket
j'ai écrit un petit programme qui interagit avec un serveur sur un port spécifique. Le programme fonctionne bien, mais:
une fois que le programme s'est terminé de manière inattendue, et depuis que cette connexion socket est affichée dans l'état CLOSE_WAIT
. Si j'essaie d'exécuter un programme, il est suspendu et je dois le forcer à se fermer, ce qui accumule même les connexions de socket plus CLOSE_WAIT
.
Est-il un moyen de vider ces connexions?
4 réponses
CLOSE_WAIT
signifie que votre programme est toujours en cours d'exécution et qu'il n'a pas fermé la socket (et que le noyau attend qu'il le fasse). Ajouter -p
à netstat
pour obtenir le pid, puis le tuer avec plus de force (avec SIGKILL
si nécessaire). Ça devrait vous débarrasser de vos douilles CLOSE_WAIT
. Vous pouvez également utiliser ps
pour trouver le pid.
SO_REUSEADDR
est pour les serveurs et les TIME_WAIT
sockets, donc ne pas s'appliquer ici.
comme décrit par Crist Clark .
CLOSE_WAIT signifie que l'extrémité locale de la connexion a reçu un FIN de l'autre côté, mais L'OS attend le programme au locaux en fin de fermer réellement sa connexion.
le problème est que votre programme tournant sur la machine locale n'est pas la fermeture de la socket. Il ne s'agit pas d'une question de réglage TCP. Une connexion peut (et tout à fait correctement) pour rester dans CLOSE_WAIT forever alors que le programme détient la connexion ouverte.
une fois que le programme local ferme la socket, L'OS peut envoyer la FIN à la fin distante qui vous fait passer à LAST_ACK pendant que vous attendez l'accusé de réception de la NAGEOIRE. Une fois reçue, la connexion est terminée et tombe de la table de connexion (si votre fin est dans CLOSE_WAIT vous faire pas fin en place dans l'état TIME_WAIT).
même si trop de connexions CLOSE_WAIT signifie qu'il y a quelque chose qui ne va pas avec votre code dans le premier et que ce n'est pas une bonne pratique acceptée.
vous pourriez vouloir vérifier: https://github.com/rghose/kill-close-wait-connections
ce que fait ce script est d'envoyer L'ACK que la connexion attendait.
C'est ce qui a fonctionné pour moi.
j'ai aussi le même problème avec un serveur Tomcat très récent (7.0.40). Il ne réagit pas une fois pendant quelques jours.
Pour voir les connexions ouvertes, vous pouvez utiliser:
sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT
comme mentionné dans ce post , vous pouvez utiliser /proc/sys/net/ipv4/tcp_keepalive_time
pour voir les valeurs. La valeur semble être en secondes et par défaut à 7200 (soit 2 heures).
pour les changer, vous devez éditer /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`