Je fais des tests de charge sur une application web déployée dans JBoss. Il démarre bien, mais comme les rampes d'essai vers le haut et les utilisateurs plus simulés commencer à frapper JBoss, les performances se dégradent sévèrement:JBoss threads en attente sur un moniteur aléatoire
Resposne time chart http://i46.tinypic.com/2mob2f9.jpg
Connexion VisualVM à elle, je peux voir les fils étaient bien, puis tout à coup commencé à dépenser la plupart de leur temps d'attente pour un moniteur (vert est en cours d'exécution, le rouge est le moniteur, le jaune est attente):
Thread state graph http://i46.tinypic.com/105v6lk.jpg
Courir jstack, je vois les fils sont tous en attente dans le même endroit:
"http-0.0.0.0-8080-172" daemon prio=6 tid=0x000000005da90000 nid=0xd2c waiting for monitor entry [0x000000006cb4e000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:185) - waiting to lock (a org.apache.log4j.spi.RootCategory) at org.apache.log4j.Category.forcedLog(Category.java:372) at org.apache.log4j.Category.debug(Category.java:241) [my code]
La plupart des threads du processeur HTTP ~ 200 attendent le même moniteur. En regardant log4j.xml pour le WAR, il a une configuration d'appender unique pour CONSOLE. Je supprime l'appender et recommence mon test. Même comportement, à l'exception jstack montre tous les fils d'attente dans un endroit différent:
"http-0.0.0.0-8080-251" daemon prio=6 tid=0x0000000059811800 nid=0x1108 waiting for monitor entry [0x0000000073ebe000] java.lang.Thread.State: BLOCKED (on object monitor) at java.util.Hashtable.get(Hashtable.java:333) - waiting to lock (a org.jboss.util.property.PropertyMap) at java.util.Properties.getProperty(Properties.java:932) at org.jboss.util.property.PropertyMap.getProperty(PropertyMap.java:626) at java.lang.System.getProperty(System.java:653) at org.jaxen.saxpath.helpers.XPathReaderFactory.createReader(XPathReaderFactory.java:109) at org.jaxen.BaseXPath.(BaseXPath.java:124) at org.jaxen.BaseXPath.(BaseXPath.java:153) at nu.xom.JaxenConnector.(JaxenConnector.java:49) at nu.xom.Node.query(Node.java:424) [my code]
rien changer, je redémarre JBoss, exécutez le test, puis exécutez jstack une fois qu'il est lent. Tous les fils attendent encore dans un autre lieu:
"http-0.0.0.0-8080-171" daemon prio=6 tid=0x000000005d0d1000 nid=0x15d4 waiting for monitor entry [0x000000006cb4e000] java.lang.Thread.State: BLOCKED (on object monitor) at sun.nio.cs.FastCharsetProvider.charsetForName(FastCharsetProvider.java:118) - waiting to lock (a sun.nio.cs.StandardCharsets) at java.nio.charset.Charset.lookup2(Charset.java:449) at java.nio.charset.Charset.lookup(Charset.java:437) at java.nio.charset.Charset.isSupported(Charset.java:479) at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:49) at java.io.InputStreamReader.(InputStreamReader.java:57) at java.io.FileReader.(FileReader.java:41) [my code]
Que dans le diable se passe? J'ai utilisé jstack dans le passé et j'ai essayé de l'utiliser quand les choses tournent bien et j'ai obtenu les résultats attendus. Je suppose que jstack va bien. Des idées qui pourraient causer un tel comportement étrange? Des idées sur où aller à partir d'ici?
Sans plus de contexte/d'information, il est difficile de dire précisément ce qui se passe. En général, il semble qu'il y ait beaucoup de conflits pour diverses ressources et/ou une situation de blocage possible. Comme votre première étape, il semble que vous avez supprimé une partie de la contention pour log4j. Est-il possible de faire la même chose pour les deux autres ressources en combinant des résultats de requête de mise en cache ou en synchronisant l'accès à des structures de données pouvant mener à un blocage? – btreat
Je suis heureux de fournir plus d'informations, je ne suis pas sûr de ce qu'il faut fournir. Chose étrange, bien qu'il y ait beaucoup de conflits, les threads ne sont pas bloqués. Ils attendent sur un moniteur pendant 2 à 10 secondes et plus, puis l'exécution continue, puis peu de temps après l'attente sur un moniteur. Les appels sont très basiques (par exemple System.getProperties) et ne peuvent pas être évités. JBoss et d'autres codes tiers font ces appels. Puisque je suis assez sûr que System.getProperties et HashTable sont solides, ma prochaine estimation est que jstack est trompeur quand la contention se produit. Si oui, comment pourrais-je déterminer où se situe la contention? – NateS