2011-04-11 3 views
5

Nous avons une application qui laisse échapper un peu de mémoire, un peu étant un euphémisme.Apache Tomcat Request Threads

J'utilise jvisualvm pour essayer de trouver l'origine du problème.

Je vois le nombre de threads croître un peu sur les sujets commençant par le nom: http -8080, par exemple: http: 8080-42

Ma première hypothèse est que chacun de ces fils est un succès de la demande à partir du client, car chaque requête client est gérée dans son propre thread.

Mon problème est que ces threads ont fonctionné pendant de longues périodes (jusqu'à présent 10mins).

Ma question est la suivante:

est mon hypothèse correcte? Si oui, pourquoi les Threads fonctionnent-ils si longtemps? Il ne peut certainement pas être occupé à servir la demande des clients?

+0

Est-il possible que ces threads soient des threads de session? – Koekiebox

Répondre

6

Tomcat a toujours un certain nombre d'attente threads HTTP, par exemple, si nous regardons le réglage du connecteur par défaut:

<Connector port="80" maxHttpHeaderSize="8192" 
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
       enableLookups="false" redirectPort="8443" acceptCount="100" 
       connectionTimeout="20000" disableUploadTimeout="true" /> 

On peut voir qu'il y ait toujours au moins 25 fils de discussion en direct, mais en attente pour les connexions (jusqu'à la limite maxThreads). Ceci est contrôlé par les attributs min et maxSpareThreads.

Qu'est-ce que JVisual VM indique que le thread est en train d'attendre ou verrouillé sur une ressource, etc.?

+0

Tous ces fils sont dans un état WAITING: "http-8080-24" - Discussion t @ 70 java.lang.Thread.State: ATTENDRE \t à java.lang.Object.wait (Native Method) \t - en attente sur <96c084> (un org.apache.tomcat.util.net.JIoEndpoint $ travailleur) \t à java.lang.Object.wait (Object.java:485) \t à org.apache.tomcat.util.net.JIoEndpoint Worker.await $ (JIoEndpoint.java:414) \t à org.apache.tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.java:440) \t à java.lang.Thread.run (Thread.java : 619) Synchroniseurs verrouillables propriétaires: \t - Aucun – Koekiebox

+0

Oui, ils attendent juste plus de connexions - parfaitement attendu (et comportement souhaitable). :) – Mikaveli

1

De manière générale, les serveurs d'applications vont pré-créer un certain nombre de threads. Non seulement le serveur d'applications les créera, mais il conservera les threads. Ceci est connu comme un pool de threads. Le serveur prendra une requête et l'enverra à un thread, et lorsque cette requête sera terminée, le serveur enverra une nouvelle requête à ce thread.

La surcharge de création de threads est plutôt coûteuse, donc la gestion de nombreuses requêtes profite grandement du partage des threads. Pour répondre à votre question, l'envoi de threads créés par le serveur (en supposant qu'aucune erreur d'exécution sérieuse ne se produise) se produira pendant la durée de vie du serveur. En ce qui concerne ce que vous voyez, si vous voyez beaucoup de threads démarrés, alors une autre partie de l'application peut être des threads forking dans lesquels est un problème complètement séparé.

Il est important de savoir que votre serveur Tomcat ne devrait pas créer de nouveaux threads pour chaque requête (encore une fois en général) il devrait réutiliser des threads.

2

Vérifiez les configurations du connecteur Tomcat. Faites attention à maxThreads et à d'autres configurations de pool de threads. Une erreur fréquente consiste à simplement augmenter maxThreads sans réellement "réglage". Si vous configurez un pool inutilement grand, cela entraînera beaucoup de threads inactifs. Cela ne servira à rien.

Même si c'est évident, juste pour l'enregistrement, les threads TIMED_WAITING expireront, et les threads WAITING seront juste là pour un notify() ou un notifyAll().