2010-03-03 3 views
2

J'ai rencontré un problème de stabilité vraiment bizarre en production lors de l'exécution d'une application Grails trivial utilisant des composants standard.Grailles + problème Tomcat + Ubuntu: connexions CLOSE_WAIT

Après un certain temps de fonctionnement normal, le nombre de Tomcat (jsvc) connexions TCP à l'état CLOSE_WAIT augmente jusqu'à ce que Tomcat atteint son plafond de fil (Maximum number of threads (N) created for connector), après quoi Tomcat enraye.

Normalement, cela indiquerait que l'application contient du code qui ne ferme pas correctement ses connexions TCP. Cependant, mon code Grails dans cette application est vraiment très trivial et n'initie aucune connexion TCP seule, donc je ne peux pas penser à un scénario où mon code pourrait causer le problème CLOSE_WAIT.

En outre, tous les composants de la pile sont des éléments standard que je suppose être sans bug; Je cours Grails 1.2.1 sous le Tomcat 6 standard qui est livré dans Ubuntu 9.1 (apt-get install tomcat6).

  • Est-ce un problème connu?
  • Comment allez-vous résoudre le problème?
+0

Pouvez-vous vérifier que la connexion http est obsolète, pas par ex. connexions de base de données que votre application fait? Est-ce un site public - vous laissant "vunerable" à syn inondation, ou un crawler Web trop désireux? Le site est-il uniquement accessible par le navigateur ou d'autres clients potentiellement défaillants qui ne parviennent pas à fermer leurs connexions? – nos

+0

Yepps. Ce sont les connexions HTTP qui sont bloquées dans CLOSE_WAIT. Le site est accessible à tous les types de navigateurs, y compris les robots, ce qui fait que des clients bogués peuvent y accéder. Mais je suppose que la pile devrait être robuste pour ces clients buggés :-) – knorv

+1

Le connecteur NIO est généralement plus résilient par rapport à celui par défaut – nos

Répondre

3

Le "Tomcat Expert Series: Performance Tuning" (2009) de Filip Hanik est un excellent guide pour optimiser les performances et améliorer la stabilité de Tomcat.

J'ai trouvé les conseils suivants dans le guide pour être pertinents:

  • Vue d'ensemble des options de réglage: Threads, Keep-alive, TCP Carnet de commandes (acceptCount), connectionTimeout, buffers, connecteurs: BIO par rapport à avril par rapport à NIO (page 24)
  • Comment choisir entre les connecteurs BIO/APR/NIO (page 26-32)
  • MaxThreads Tuning (page 33-34)
  • Tuning MaxKeepAliveRequests (page 35-36)
  • Réglage acceptCo UNT (page 37-38)
  • Tuning connectionTimeout (page 39-40)
  • Paramètres JVM Tuning (page 44-50)

Dans le cas décrit ici commutation à un connecteur NIO, de plus en plus maxThreads et abaisser connectionTimeout pourrait faire l'affaire.

0

Y a-t-il un pare-feu inclus dans le scénario? Ceux-ci ont tendance à laisser tomber la connexion TCP/IP inactive après un moment donnant le comportement que vous voyez.

+0

Non, pas de pare-feu.S'il y avait eu un pare-feu supprimant les connexions TCP/IP inactives, Tomcat n'utilise-t-il pas un certain mécanisme de temporisation pour fermer les connexions dans l'état CLOSE_WAIT? – knorv

+0

L'état CLOSE_WAIT attend que l'autre extrémité de la connexion TCP/IP reconnaisse que la connexion a été fermée. Apparemment, il ne le fait jamais. J'envisagerais fortement de déterminer exactement quelles connexions font l'expérience de cela, afin que vous puissiez en déduire pourquoi. –