Pourquoi est-ce que je vois beaucoup de sockets dans l'état CLOSE_WAIT lorsque le service web cesse de fonctionner?
Mon webservice java en cours d'exécution sur la Jetée tombe après une période de quelques heures et de l'enquête montrent de nombreux sockets dans CLOSE_WAIT état. Alors qu'il fonctionne correctement, il ne semble pas prises en CLOSE_WAIT statut, mais quand ça se passe mal, il y a des charges.
J'ai trouvé ce définition
CLOSE-WAIT: Le local de point final a reçu une demande de fin de connexion et reconnu par exemple, un passif de près, a été réalisée et les locaux en fin de point de besoin de réaliser une active fermer pour quitter cet état.
Avec netstat sur mon serveur je vois une liste de sockets tcp dans CLOSE_WAIT statut, l'adresse locale de mon serveur et l'adresse à l'étranger mon équilibrage de la charge de la machine. Donc je suppose que cela signifie que le client (équilibrage de charge) a mis fin à la connexion à sa fin dans un mauvais chemin, et mon serveur n'est pas correctement fermé la connexion à sa fin.
Mais comment puis-je faire, mon code Java n'a pas affaire à un faible niveau des sockets ?
Ou est l'équilibrage de charge de terminaison de connexion en raison d'un problème causé par quelque chose que mon serveur est fait mal dans le code.
source d'informationauteur Paul Taylor
Vous devez vous connecter pour publier un commentaire.
Sonne comme un bug dans la Jetée ou de la JVM, peut-être que cette solution de contournement va travailler pour vous:
http://www.tux.hk/index.php?entry=entry090521-111844
Ajoutez les lignes suivantes à /etc/sysctl.conf
Et ensuite exécuter
ou faire un reboot
Nous avons le même problème dans notre projet. Je ne suis pas sûr que c'est ton cas, mais il sera peut-être utile.
La raison en est qu'un grand nombre de demandes ont été traitées par la logique métier avec synchronisation de bloc. Ainsi, lorsque le client envoie des paquets à abandonner la connexion, le fil lié à cette prise a été occupé, en attente pour le moniteur.
Les journaux montrent exceptions pour org.eclipse.la jetée.io.WriteFlusher à la méthode d'écriture:
et pour org.eclipse.la jetée.serveur.HttpOutput à la méthode close. Je pense que cette exception près que l'étape est la raison de sockets' état CLOSE_WAIT:
La solution rapide dans notre cas, était l'augmentation de la idleTimeout. La bonne solution (à nouveau dans notre cas) est le code refactoring.
Donc, mon conseil est de lire attentivement la Jetée de journaux avec le niveau de DÉBOGAGE de trouver des exceptions et d'analyser les performances de l'application avec VisualVM. Peut-être la raison en est le goulot d'étranglement des performances (synchronisé des blocs?).
Je crois que cela pourrait être quelque chose de provoquant une longue ou une boucle infinie/attente infinie dans votre code serveur, et Jetée tout simplement jamais obtient une chance de fermer la connexion (sauf si il y a une sorte de délai d'expiration de force à la ferme le socket après une certaine période). Considérons l'exemple suivant:
Avec le
infinite
-variable définie sur true, le Printwriter (et de socket sous-jacente) n'est jamais fermée en raison de boucle infinie. Si je l'exécute et le connecter à la prise à l'aide de telnet, puis quittez le telnet client,netstat
montrera le côté serveur de socket encore dansCLOSE_WAIT
-état (je pourrais aussi voir le côté client de la prise en FIN_WAIT2 état d'un certain temps, mais il va disparaître):Le côté serveur socket accepté coincée dans la CLOSE_WAIT -état. Si j'ai vérifier les piles de threads pour le processus, je peux voir le thread en attente à l'intérieur de la do...while boucle:
Si j'ai mis le
infinite
-variable à false, et faire la même chose (connect client & déconnexion), le socket avecCLOSE_WAIT
l'état d'afficher jusqu'à ce que l'écrivain est fermé (fermeture de la socket sous-jacente), et puis disparaît. Si l'auteur ou de la prise n'est jamais fermée, le côté serveur de socket sera de nouveau coincé dansCLOSED_WAIT
même si le thread se termine (je ne pense pas que cela devrait se produire dans la Jetée, si votre méthode renvoie à un certain point, la Jetée devrait probablement prendre soin de la fermeture de la socket).Donc, les étapes, je vous suggère de l'essayer et de trouver le coupable sont
jstack
la prochaine fois ce problème se produit et essaie d'identifier les "coincé" threadsThrowable
s, de sorte que ce n'est probablement pas la question, mais peut-être la peine de vérifier si tout le reste échoueVous pouvez aussi le nom du fils quand ils entrer et sortir de vos méthodes avec quelque chose comme
pour les repérer plus facilement si il y a beaucoup de threads en cours d'exécution.
J'ai fait face à un problème similaire, tandis que le coupable code peuvent différer, les symptômes ont été
1) Serveur (Jetée) était en cours d'exécution, mais pas encore de traitement de la demande
2) Il n'y a pas extra ordinaire de charge/exceptions
3) Trop CLOSE_WAIT connexions étaient là.
Ces suggéré que tous les threads de travail dans le serveur sont coincés quelque part. Jstack Thread dump a montré que tous nos threads de travail ont été coincés dans apache HttpClient objet. (en raison de unclosed réponse objets), et depuis tous les fils étaient en attente à l'infini, aucun n'est disponible pour traiter la demande entrante.
Est l'équilibreur de charge encore en place? Essayez d'arrêter le programme d'équilibrage de charge et de voir si cela est le problème et non sur le serveur.
Cela signifie probablement que vous n'êtes pas le nettoyage de vos connexions entrantes. Assurez-vous que les connecteurs sont arriver a fermé à la fin de chaque transaction. (Le mieux fait dans un bloc finally proche du début de votre code serveur afin que les connexions se ferment, même si côté serveur des exceptions se produisent.)