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?

62
demandé sur Chris Martin 2013-04-09 17:31:29

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.

55
répondu derobert 2013-04-09 17:30:04

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).

30
répondu user2618402 2017-06-26 15:11:10

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.

6
répondu mirage 2014-11-14 10:58:21

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`
5
répondu Amil Waduwawara 2017-04-13 12:36:24