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' CLOSE_WAIT
état. Si j'essaie d'exécuter un programme, il se bloque et je dois le forcer à se fermer, ce qui accumule encore plus de CLOSE_WAIT
connexions de socket.
Existe-t-il un moyen de rincer ces connexions?
Réponses:
CLOSE_WAIT
signifie que votre programme est toujours en cours d'exécution, et n'a pas fermé le socket (et le noyau attend qu'il le fasse). Ajoutez-p
ànetstat
pour obtenir le pid, puis tuez-le plus énergiquement (avecSIGKILL
si nécessaire). Cela devrait vous débarrasser de vosCLOSE_WAIT
prises. Vous pouvez également utiliserps
pour trouver le pid.SO_REUSEADDR
est pour les serveurs et lesTIME_WAIT
sockets, donc ne s'applique pas ici.la source
Comme décrit par Crist Clark .
la source
close()
ouclosesocket()
, selon la plate-forme que vous utilisez.J'ai également le même problème avec un tout dernier serveur Tomcat (7.0.40). Il ne répond plus une fois pendant quelques jours.
Pour voir les connexions ouvertes, vous pouvez utiliser:
Comme mentionné dans cet article , vous pouvez utiliser
/proc/sys/net/ipv4/tcp_keepalive_time
pour afficher les valeurs. La valeur semble être en secondes et par défaut à 7200 (soit 2 heures).Pour les modifier, vous devez les modifier
/etc/sysctl.conf
.la source
Même si un trop grand nombre de connexions CLOSE_WAIT signifie qu'il y a un problème avec votre code dans le premier et que cela n'est pas une bonne pratique.
Vous voudrez peut-être 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.
la source
Il convient de mentionner que l'
Socket
instance à la fois client et serveur doit être invoquée explicitementclose()
. Si une seule des extrémités appelleclose()
alors aussi, la socket restera dans l'état CLOSE_WAIT.la source
Vous pouvez fermer de force les sockets avec la
ss
commande; lass
commande est un outil utilisé pour vider les statistiques de socket et affiche des informations de la même manière (bien que plus simple et plus rapide) à netstat.Pour tuer n'importe quel socket dans l'état CLOSE_WAIT, exécutez ceci (en tant que root)
la source
Il est également intéressant de noter que si votre programme génère un nouveau processus, ce processus peut hériter de tous vos descripteurs ouverts. Même après la fermeture de votre propre programme, ces handles hérités peuvent toujours être actifs via le processus enfant orphelin. Et ils n'apparaissent pas nécessairement tout à fait de la même manière dans netstat. Mais tout de même, le socket restera dans CLOSE_WAIT tant que ce processus enfant est actif.
J'ai eu un cas où je dirigeais ADB. ADB lui-même génère un processus serveur s'il n'est pas déjà en cours d'exécution. Cela a hérité de tous mes descripteurs au départ, mais ne s'est révélé en posséder aucun lorsque j'enquêtais (la même chose était vraie pour macOS et Windows - pas sûr pour Linux).
la source