Dépannage des connexions coincé dans CLOSE_WAIT état
J'ai une application Java s'exécutant dans WebLogic 11g sur Windows, qui après plusieurs jours, ne répond pas. Un suspect symptôme que j'ai remarqué, c'est qu'un grand nombre de connexions (environ 3000) se manifestent dans netstat
avec un CLOSE_WAIT statut, même lorsque le serveur est inactif. Depuis le serveur d'application est de gérer les connexions client, je ne suis pas sûr de ce qui cause cela. Nous faisons aussi un certain nombre d'appels de service web que de bouclage sur le même serveur, mais je crois que ces connexions se ferment correctement. Quoi d'autre pourrait en être la cause et comment résoudre un problème de ce genre?
- Êtes-vous sûr de toujours fermer la connexion côté serveur?
- Sont-ils comme CLOSE_WAIT même avant que l'application ne répond plus?
- Je ne ferme pas les connexions sur le côté serveur, WebLogic n'. @Robin - Oui, sur un même serveur configuré, je vois les connexions s'accumuler avant que le serveur tombe.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et j'ai étudié les sockets pour se débarrasser de ce problème.
Permettez-moi de dire quelques mots, mais avant je dois dire que je ne suis pas un programmeur Java.
Je ne vais pas expliquer ce que close_wait est, comme Brian White déjà dit tout ce qui doit être dit.
Pour éviter close_wait, vous devez vous assurer que votre serveur n'a pas de fermer la connexion après il envoie la réponse, car quiconque se déconnecte de la première à obtenir coincé dans close_wait et time_wait. Donc, si votre serveur est coincé dans close_wait il me dit qu'il est de déconnecter après il envoie la réponse.
Vous devriez éviter cela en faisant quelques choses.
1 - Si votre application client n'est pas en utilisant le protocole http 1.1, vous devez le configurer pour l'utiliser en raison de la
'keep-alive
en-tête http option.2 - Si votre client est en cours d'exécution http 1.1 et cela ne fonctionne pas, ou, si vous devez utiliser le protocole http 1.0, vous devez définir la connexion en-tête de demande de propriété:
Cela indique au serveur que ni le client ni le serveur doit déconnecter après avoir rempli une demande. En faisant cela, votre serveur ne sera pas déconnecter après chaque requête qu'il reçoit.
3 - En à votre client, de réutiliser votre support. Si vous êtes à la création d'un lot de clients des sockets dans une boucle par exemple, vous devez créer un socket une fois et l'utiliser chaque fois que vous envoyez une demande. L'approche que j'ai utilisée dans mon application est d'avoir une prise piscine et obtenir une prise disponible (ce qui est déjà connecté au serveur et il a le keep-alive de propriété). Puis-je l'utiliser et quand je suis en fait je l'ai remis dans la piscine pour être réutilisables.
4 - Si vous avez vraiment besoin de déconnecter après l'envoi d'une demande, assurez-vous que votre client ne que et de garder la
connection: keep-alive
.Et oui, vous pouvez rencontrer des problèmes lorsque vous avez beaucoup de close_waits ou time_waits sur le côté serveur.
Découvrez ce [lien][1] qui expliquent ce
keep-alive
est.J'espère que cela vous a été utile. Avec ces choses que j'ai réussi à résoudre mon problème.
[1]: http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistent Connexions
CLOSE_WAIT
est l'état le local TCP de la machine d'état est lorsque l'hôte distant envoie une FIN (la ferme de la connexion), mais l'application locale n'a pas fait la même chose et a envoyé une réponse FIN. Il est encore possible pour la machine locale pour envoyer des données à ce stade si le client ne peut pas recevoir (sauf si il a seulement une demi-fermeture de la connexion).Lorsque l'hôte distant ferme (envoie une FIN), votre application locale obtiendrez un événement quelconque (c'est une "lecture" de l'événement sur le support de la base de la bibliothèque C) mais la lecture de cette connexion retournera un message d'erreur pour indiquer que la connexion a été fermée. À ce stade, l'application locale doit fermer la connexion.
Je sais peu de choses sur Java et rien sur WebLogic, mais je suppose que c'est possible que l'application n'est pas de la manipulation de l'erreur de lecture correctement et donc ne jamais fermer la connexion.
La
CLOSE_WAIT
statut signifie que l'autre côté a lancé une connexion étroite, mais l'application sur le côté local n'a pas encore fermé le socket.Il semble que vous avez un bug dans votre application locale.
Le problème était dû à un bug déclenchée par le paramètre "Utiliser la JSSE SSL" pour de vrai dans webLogic. À l'aide de WebLogic SSL de mise en place de JSSE n'est pas un problème pour notre application, j'ai donc simplement décoché que l'établissement et le problème a disparu.
J'ai trouvé cette citation sur CLOSE_WAIT pileups: "quelque Chose est soit en empêchant les progrès de
se produire dans la session HTTP (nous sommes coincés afin de ne jamais l'appel de fermer), ou certains bug a été introduit, qui empêche la prise de la fermeture. Il y a un certain nombre de façons, cela peut arriver."
Pense: Est-il possible que votre demande pourrait être coincé lors du traitement d'une demande? Ou WebLogic lui-même?
Examiner: Pouvez-vous faire le fil de Java dumps (kill-SIGQUIT peut être utilisé pour que la JVM Oracle pour Linux) pour essayer de voir si, en fait, un de vos fils SONT coincés?
Examiner le côté client: tout d'Abord, trouver l'adresse IP ou le nom d'hôte de la les clients qui sont connectés à la CLOSE_WAIT sockets. Ensuite, voir si quelque chose de suspect se passe sur ces clients.
Cela pourrait signifier que vous n'êtes pas à l'appel de "fermer" sur un socket à partir de votre appel accept ().