Apache Tomcat Threads en ATTENTE avec 100% d'utilisation CPU
L'application, lorsqu'il est soumis à la charge, parfois, utilise 100%.
faire un kill -quit <pid>
a montré 1100+ threads en attente:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode):
"http-8080-1198" daemon prio=10 tid=0x00007f17b465c800 nid=0x2061 in Object.wait() [0x00007f1762b6e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00007f17cb087890> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
- locked <0x00007f17cb087890> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:619)
"http-8080-1197" daemon prio=10 tid=0x00007f17b465a800 nid=0x2060 in Object.wait() [0x00007f1762c6f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00007f17cb14f460> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
- locked <0x00007f17cb14f460> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:619)
............
L'état ne change pas, même lorsque l'application de contexte n'est pas déployée OU le DB est redémarré.
S'il vous plaît suggérer une cause probable.
Application Server: Apache Tomcat 6.0.26
Max De Threads: 1500
Threads en ATTENTE : 1138
OriginalL'auteur M.N | 2010-09-23
Vous devez vous connecter pour publier un commentaire.
"en attente sur" n'est pas un problème. Le thread est en attente d'être informé - et dans ce cas, il est verrouillé sur le JIoEndpoint.Travailleur
Donc je pense que c'est en attente pour les demandes à venir.
Tout d'abord, l'utilisation du PROCESSEUR augmente lorsque vous avez de nombreux threads en raison de la forte quantité de commutation de contexte. Avez-vous réellement besoin de 1500? Pouvez-vous essayer en réduisant?
Deuxièmement, Est-il de la mémoire monopolisant ou GC-ing trop souvent?
"en attente pour" serait un problème si vous pouvez voir ces. Avez-vous BLOQUÉ(sur l'objet du moniteur) ou en attente de verrou () dans la trace de la pile?
Le test de charge est la bonne façon de faire. Cela dépend de combien de temps chaque demande par l'utilisateur et quel traitement ils sont généralement le ferait. people.apache.org/~mturk/docs/article/ftwai.html dit *Pour obtenir plus de Tomcat, vous devez limiter le nombre de requêtes simultanées à 200 par UC. *
7500 simultanées les utilisateurs ou les demandes - c'est beaucoup - alors, êtes-vous en cluster?
OriginalL'auteur JoseK
Sur un système Solaris, vous pouvez utiliser la commande
Cela va vous donner une pause en bas de chaque processus de travail faire sur le CPU et sera basé sur le poids Léger de processeur ID, au lieu de la PID. Lorsque vous regardez votre thread dump vous pouvez faire correspondre la lumière du poids à votre NID (ou TID selon les implémentations) qui sont affichés sur la ligne supérieure de votre thread dump. Par la correspondance de ces deux choses, vous serez en mesure de dire qui de vos fils sont le CPU porc.
Voici un exemple de la sortie.
Puis avec un correspondant thread dump, vous pouvez trouver ces fils
Ainsi, dans le cas de cette Haute CPU cas, le problème était dans la collecte des Ordures. Cela se voit par la correspondance de nid avec la LWPID champ
Si cela va vous aider, je suggère de faire un script qui va prendre la sortie de votre prstat et l'utilisation du PROCESSEUR à la fois. De cette manière, vous wil la représentation la plus exacte de votre application.
Que par les originaux de vos deux fils, @joseK était correcte. Ces fils sont assis et d'attendre pour prendre une demande d'un utilisateur. Il n'y a pas de problème.
OriginalL'auteur Sean