Przeprowadzam testy obciążenia w aplikacji internetowej wdrożonej w JBoss. Zaczyna się dobrze, ale jak pochylnie przetestowanie i więcej symulowanych użytkowników rozpocząć uderzenie JBoss, wydajność obniża poważnie:Nici JBoss czekające na losowym monitorze
Resposne time chart http://i46.tinypic.com/2mob2f9.jpg
Podłączanie VisualVM do niego, widzę gwinty były w porządku, a potem nagle zaczął wydatków większość czasu oczekiwania na monitorze (zielony jest uruchomiony, czerwony jest monitor, żółty to czekać):
Thread state graph http://i46.tinypic.com/105v6lk.jpg
Running jstack widzę gwinty wszyscy czekają w tym samym miejscu:
"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]
Większość ~ 200 wątków procesora HTTP czeka na ten sam monitor. Patrząc na log4j.xml dla WAR, ma on konfigurację pojedynczego instalatora dla CONSOLE. Usuwam aplikanta i ponownie testuję. Takie samo zachowanie, z wyjątkiem jstack pokazuje wszystkie wątki czekające w innym miejscu:
"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]
Zmiana nic, ja zrestartować JBoss, uruchom test, a następnie uruchomić jstack raz robi się powoli. Wszystkie wątki czekają jeszcze w innym miejscu:
"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]
Co u diabła się dzieje? Używałem jstack w przeszłości i próbowałem go uruchomić, gdy wszystko działa dobrze i przynosi oczekiwane rezultaty. Zakładam, że jstack jest w porządku. Wszelkie pomysły, które mogą powodować takie dziwne zachowanie? Jakieś pomysły na temat, dokąd się udać?
Bez większej ilości kontekstów/informacji trudno powiedzieć dokładnie, co się dzieje. Generalnie wygląda na to, że istnieje wiele sporów dotyczących różnych zasobów i/lub możliwej sytuacji impasu. Jako pierwszy krok brzmi, jakbyś usunął część rywalizacji o log4j. Czy można zrobić to samo dla dwóch pozostałych zasobów, stosując kombinację wyników zapytania buforowania lub synchronizując dostęp do struktur danych, co może doprowadzić do zakleszczenia? – btreat
Chętnie udzielę więcej informacji, po prostu nie jestem pewien, co należy podać. Dziwne jest to, że istnieje wiele sporów, nici nie są zablokowane. Czekają na monitorze przez 2 do 10+ sekund, a następnie wykonanie trwa, a następnie krótko po ponownym odczekaniu na monitorze. Połączenia są bardzo proste (np. System.getProperties) i nie można ich uniknąć. JBoss i inne strony trzecie wykonują te połączenia. Ponieważ jestem całkiem pewny, że System.getProperties i HashTable są solidne, moim następnym najlepszym przypuszczeniem jest to, że jstack wprowadza w błąd, gdy pojawia się rywalizacja. Jeśli tak, to w jaki inny sposób mógłbym ustalić, gdzie dojdzie do rywalizacji? – NateS