Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Witajcie,

na moim serwerze (linux) proces javy pozera 99% CPU. Zdarza sie to regularnie co 2 tygodnie (w piatki).
Na tym procesie jest Tomcat a na nim kilka aplikacji web'owych.
Jak zrestartuje Tomcata to wszystko wraca do normy, czasami samo (bez restartu) wraca po 20-30 minutach.

Nie mialem przedtem do czynienia z taki problemem, jednak domyslam sie, ze po postu musze dokladnie przeanalizowac co sie dzieje w tym procesie i gdzie jest blad (tj. ktora aplikacja/klasa powoduje ten efekt.

Czy moglibyscie polecic program do analizy ?

Pozdrawiam,
Rafal
Łukasz Żuchowski

Łukasz Żuchowski Software Wizard

Temat: Proces Javy przeciaza CPU

Rafal M.:
Witajcie,

na moim serwerze (linux) proces javy pozera 99% CPU. Zdarza sie to regularnie co 2 tygodnie (w piatki).
Na tym procesie jest Tomcat a na nim kilka aplikacji web'owych.
Jak zrestartuje Tomcata to wszystko wraca do normy, czasami samo (bez restartu) wraca po 20-30 minutach.

Nie mialem przedtem do czynienia z taki problemem, jednak domyslam sie, ze po postu musze dokladnie przeanalizowac co sie dzieje w tym procesie i gdzie jest blad (tj. ktora aplikacja/klasa powoduje ten efekt.

Czy moglibyscie polecic program do analizy ?

Pozdrawiam,
Rafal

Szukaj pod hasłem "profiler".
Być może, któraś z aplikacji ma zadania automatyczne, które wykonują się o określonej porze, określonego dnia. Za ich odpalanie może odpowiedzialny być "quarz".
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: Proces Javy przeciaza CPU

w jdk 6 jest jvisualvm - czasem można się z tego conieco dowiedzieć
skoro ma takie zwichy to musisz nastroić gc
zwróć też uwagę na rozmiar dla PermGen i szczególnie poobserwuj co się z tym dzieje
polecam art: http://java.sun.com/javase/technologies/hotspot/gc/gc_...
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Rafal M.:
Witajcie,

na moim serwerze (linux) proces javy pozera 99% CPU. Zdarza sie to regularnie co 2 tygodnie (w piatki).
Na tym procesie jest Tomcat a na nim kilka aplikacji web'owych.
Jak zrestartuje Tomcata to wszystko wraca do normy, czasami samo (bez restartu) wraca po 20-30 minutach.

Nie mialem przedtem do czynienia z taki problemem, jednak domyslam sie, ze po postu musze dokladnie przeanalizowac co sie dzieje w tym procesie i gdzie jest blad (tj. ktora aplikacja/klasa powoduje ten efekt.

Czy moglibyscie polecic program do analizy ?

Pozdrawiam,
Rafal

Witam.

Na pierwszy rzut oka wyglada mi to na problem z pamiecia albo na heap'ie albo w permGen space tak jak kolega wczesniej napisal. Aby zmonitorować pierwsza opcje proponuje:

1. Odpalic np. JProfiler'a i online zobaczyc co sie dzieje w danej chwili z aplikacja. Niestety jak problem sie pojawia po 2 tyg dzialania aplikacji moze byc to trudne do przetestowania.

2. Jezeli uzywasz jdk (Sun, SAP and HP JDK/JVM from version 1.4.2_12 and 5.0_7 and 6.0 upwards) to mozna wymusic heap dump'a w chwili w ktorej pojawi sie problem. Wystarczy ze w opcjach startowych JVM'a Tomcata (CATALINA_OPTS) dodasz -XX:+HeapDumpOnCtrlBreak co umozliwi manulany zrzut heapa. Dla spokoju mozna dodac -XX:+HeapDumpOnOutOfMemoryError , ktory zrobi zrzut heap'a automatycznie gdy poleci OutOfMemoryError.
Uwaga! Nie wymaga to podpinania sie do procesu javy dodatkowych monitoring tool'sow itp.
Pozniej przeprowadzasz analize heap dump'a za pomoca np
SAP heap memory analyzer http://www.theserverside.com/news/thread.tss?thread_id... albo sun'owego jhat http://java.sun.com/javase/6/docs/technotes/tools/shar...
Jak juz sie dowiesz jakie obiekty zalegaly w pamieci i ile ich bylo bedzie mozna pomyslec o tuningowaniu JVM pod katem pamieci i GC.

W 1 i 2 opisalem Tobie jak mozna zobaczyc co jest grane w heap'ie. Istnieje ewentualnosc, ze problem tkwi wlasnie w PermGen space czyli fragmencie pamieci w ktorej JVM trzyma informacje o zaladowanych klasach itp. Zalazenie od wyniku Twojej analizy trzeba bedzie zwiekszyc pamiec na heap'ie lub(i) w permGen.

Czy moglbys napisac jakie opcje JVM aktualnie masz w CATALINA_OPTS?
I jaka JVM dokladnie uzywasz, odpal: >java -version

Pozdrawiam,
KrzysiekKrzysztof K. edytował(a) ten post dnia 13.09.08 o godzinie 14:30
Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Witajcie,

dzieki za odpowiedzi. Zaczalem problem glebiej analizowac, troche poczytalem na ten temat, zainstalowalem JProfilera.

Teraz mam inny problem (ale pewnie jest powiazany z tym co opisalem).

Z catalina.out (a dokladnie z informacji o gc) wynika, ze PermGen potrzebuje coraz wiecej pamieci. Wzrost jest caly czas. W nocy gdy ruch na serwerze jest duzo mniejszy to takze caly czas postepuje - ale duzo wolniej.
Trwa to az do outofmemory permgen.

Jak juz wspomnialem, w tej tematyce jestem nowy. Niestety, nie widze, zebym mogl cokolwiek przy pomocy JProfilera zdzialac. Za pomoca tego narzedzia widze co lezy na Heap'ie, jednak nie o niego chodzi (o ile sie nie myle).
Domyslam sie, ze jakis classloader zbyt czesto jest wywolywany.

Jednak, jak moge znalesc gdzie dokladnie jest blad ?
Na tym serwerze jest niestety kilkanascie aplikacji.

Gdy zmienam cos na serwerze np. konfiguracje lub dodawana jest nowa aplikacja to restartuje calego tomcata.

Java:
1.5.0_16-b02

Tomcat 5.5.17

Wywoluje tomcat nastepujaco:
java -server -Xms1g -Xmx1g -Xmn400m -XX:PermSize=350m -XX:MaxPermSize=350m -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+PrintCommandLineFlags -XX:+PrintVMOptions -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbose:class -Xbootclasspath/a:/home/tomcat/lib/cas-model-0.1-SNAPSHOT.jar:/home/tomcat/lib/commons-lang-2.1.jar -Dfile.encoding=UTF-8 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/home/tomcat/tomcat55/conf/logging.properties -agentlib:jprofilerti=port=9090,nowait,id=110,config=/home/tomcat/jprofiler5/config/config.xml -Xbootclasspath/p:/home/tomcat/jprofiler5/bin/agent.jar -Djava.endorsed.dirs=/home/tomcat/tomcat55/common/endorsed -classpath :/home/tomcat/tomcat55/bin/bootstrap.jar:/home/tomcat/tomcat55/bin/commons-logging-api.jar -Dcatalina.base=/home/tomcat/tomcat55 -Dcatalina.home=/home/tomcat/tomcat55 -Djava.io.tmpdir=/home/tomcat/tomcat55/temp org.apache.catalina.startup.Bootstrap start

Pozdrawiam,
Rafal
Krzysztof K.:
Rafal M.:
Witajcie,

na moim serwerze (linux) proces javy pozera 99% CPU. Zdarza sie to regularnie co 2 tygodnie (w piatki).
Na tym procesie jest Tomcat a na nim kilka aplikacji web'owych.
Jak zrestartuje Tomcata to wszystko wraca do normy, czasami samo (bez restartu) wraca po 20-30 minutach.

Nie mialem przedtem do czynienia z taki problemem, jednak domyslam sie, ze po postu musze dokladnie przeanalizowac co sie dzieje w tym procesie i gdzie jest blad (tj. ktora aplikacja/klasa powoduje ten efekt.

Czy moglibyscie polecic program do analizy ?

Pozdrawiam,
Rafal

Witam.

Na pierwszy rzut oka wyglada mi to na problem z pamiecia albo na heap'ie albo w permGen space tak jak kolega wczesniej napisal. Aby zmonitorować pierwsza opcje proponuje:

1. Odpalic np. JProfiler'a i online zobaczyc co sie dzieje w danej chwili z aplikacja. Niestety jak problem sie pojawia po 2 tyg dzialania aplikacji moze byc to trudne do przetestowania.

2. Jezeli uzywasz jdk (Sun, SAP and HP JDK/JVM from version 1.4.2_12 and 5.0_7 and 6.0 upwards) to mozna wymusic heap dump'a w chwili w ktorej pojawi sie problem. Wystarczy ze w opcjach startowych JVM'a Tomcata (CATALINA_OPTS) dodasz -XX:+HeapDumpOnCtrlBreak co umozliwi manulany zrzut heapa. Dla spokoju mozna dodac -XX:+HeapDumpOnOutOfMemoryError , ktory zrobi zrzut heap'a automatycznie gdy poleci OutOfMemoryError.
Uwaga! Nie wymaga to podpinania sie do procesu javy dodatkowych monitoring tool'sow itp.
Pozniej przeprowadzasz analize heap dump'a za pomoca np
SAP heap memory analyzer http://www.theserverside.com/news/thread.tss?thread_id... albo sun'owego jhat http://java.sun.com/javase/6/docs/technotes/tools/shar...
Jak juz sie dowiesz jakie obiekty zalegaly w pamieci i ile ich bylo bedzie mozna pomyslec o tuningowaniu JVM pod katem pamieci i GC.

W 1 i 2 opisalem Tobie jak mozna zobaczyc co jest grane w heap'ie. Istnieje ewentualnosc, ze problem tkwi wlasnie w PermGen space czyli fragmencie pamieci w ktorej JVM trzyma informacje o zaladowanych klasach itp. Zalazenie od wyniku Twojej analizy trzeba bedzie zwiekszyc pamiec na heap'ie lub(i) w permGen.

Czy moglbys napisac jakie opcje JVM aktualnie masz w CATALINA_OPTS?
I jaka JVM dokladnie uzywasz, odpal: >java -version

Pozdrawiam,
KrzysiekKrzysztof K. edytował(a) ten post dnia 13.09.08 o godzinie 14:30
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Witam,

Niestety jest to problem z maszyna JVM Sun'a, ktora nie potrafi zwolnic pamieci w perm gen:( Mam podobny problem na JBoss'ie, ktory korzysta z Tomcat'a i JVM Sun'a. Jezeli masz duzo aplikacji na Tomcacie + deploymenty/redeploymenty to perm gen space szybko sie zapelnia. Jak na razie widze dwa rozwiazania:
1) zwiekszyc perm gen na 512 ( -XX:PermSize=512m -XX:MaxPermSize=512m ) i zobaczyc czy dalej bedzie sie pojawial OOM
2) zmienic JVM'a Sun'a na np JRokit'a albo IBM'a i problem sam zniknie.

Pozdrawiam,
KrzysiekKrzysztof K. edytował(a) ten post dnia 08.11.08 o godzinie 10:15
Szymon Biliński

Szymon Biliński Programista Java

Temat: Proces Javy przeciaza CPU

Krzysztof K.:
Niestety jest to problem z maszyna JVM Sun'a, ktora nie potrafi zwolnic pamieci w perm gen:( Mam podobny problem na JBoss'ie, ktory korzysta z Tomcat'a i JVM Sun'a. Jezeli masz duzo aplikacji na Tomcacie + deploymenty/redeploymenty to perm gen space szybko sie zapelnia.

Myślę, że winę ponosi raczej Tomcat 5.x, który miewa problemy z zwalanianiem pamięci PermGen przy undeployowaniu aplikacji. Ostatnio miałem bardzo podobną sytuację, której prostym rozwiązaniem okazała się właśnie wymiana Tomcat'a 5.x na Jetty (tylko 1 aplikacja, a nie 15 na tym samym serwerze, więc było w miarę łatwo) ;)
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Proces Javy przeciaza CPU

Rafal M.:
Witajcie,

na moim serwerze (linux) proces javy pozera 99% CPU. Zdarza sie to regularnie co 2 tygodnie (w piatki).
Na tym procesie jest Tomcat a na nim kilka aplikacji web'owych.
Jak zrestartuje Tomcata to wszystko wraca do normy, czasami samo (bez restartu) wraca po 20-30 minutach.

Nie mialem przedtem do czynienia z taki problemem, jednak domyslam sie, ze po postu musze dokladnie przeanalizowac co sie dzieje w tym procesie i gdzie jest blad (tj. ktora aplikacja/klasa powoduje ten efekt.

Czy moglibyscie polecic program do analizy ?

Pozdrawiam,
Rafal


Sprawdź czy konsekwentnie zamykasz strumienie i takie różne.
Pułapką bywają zmienne statyczne.
Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Tylko, ze ja nie robie reload'u aplikacji. Jak cos zmieniam to robie restart calego tomcata. To problem z deploy/undeploy nie powinien istniec bo cala pamiec jest fizycznie zwalniania.

Pozdrawiam,
Rafal
Szymon Biliński:
Krzysztof K.:
Niestety jest to problem z maszyna JVM Sun'a, ktora nie potrafi zwolnic pamieci w perm gen:( Mam podobny problem na JBoss'ie, ktory korzysta z Tomcat'a i JVM Sun'a. Jezeli masz duzo aplikacji na Tomcacie + deploymenty/redeploymenty to perm gen space szybko sie zapelnia.

Myślę, że winę ponosi raczej Tomcat 5.x, który miewa problemy z zwalanianiem pamięci PermGen przy undeployowaniu aplikacji. Ostatnio miałem bardzo podobną sytuację, której prostym rozwiązaniem okazała się właśnie wymiana Tomcat'a 5.x na Jetty (tylko 1 aplikacja, a nie 15 na tym samym serwerze, więc było w miarę łatwo) ;)
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Rafal M.:
Tylko, ze ja nie robie reload'u aplikacji. Jak cos zmieniam to robie restart calego tomcata. To problem z deploy/undeploy nie powinien istniec bo cala pamiec jest fizycznie zwalniania.

Pozdrawiam,
Rafal
Szymon Biliński:
Krzysztof K.:
Niestety jest to problem z maszyna JVM Sun'a, ktora nie potrafi zwolnic pamieci w perm gen:( Mam podobny problem na JBoss'ie, ktory korzysta z Tomcat'a i JVM Sun'a. Jezeli masz duzo aplikacji na Tomcacie + deploymenty/redeploymenty to perm gen space szybko sie zapelnia.

Myślę, że winę ponosi raczej Tomcat 5.x, który miewa problemy z zwalanianiem pamięci PermGen przy undeployowaniu aplikacji. Ostatnio miałem bardzo podobną sytuację, której prostym rozwiązaniem okazała się właśnie wymiana Tomcat'a 5.x na Jetty (tylko 1 aplikacja, a nie 15 na tym samym serwerze, więc było w miarę łatwo) ;)

Mozesz zobaczyc z nowszym Tomcatem np 6.x ale moim zdaniem to wina JVM'a Sun'a.
Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

hmm, czyli z tego co piszecie to wnioskuje, ze analiza narzedziami typu JProfiler nie ma sensu bo mi wogole nie pomoze. Natomiast, musze metoda prob i bledow robic update tomcata/jvm.
Myle, zeby najpierw sprawdzic z parametrami:
CMSPermGenSweepingEnabled
CMSClassUnloadingEnabled

jak nie pomoze to zrobie update tomcata do najnowszej wersji w obrebie 5.5, czyli 5.5.27

jak nie pomoze to tymczasowo wywalac pokolei aplikacje i sprawdzac czy permgen wrasta.

JVM nie bede uaktualnial bo juz jest najwyzszy w obrebie 1.5

Sprawdzanie z tomcatem 6 lub JVM 6 czy tez przenoszenie na jetty to jest za duzy "skok". Obawiamy sie, ze nie wszystkie aplikacje moga nie chodzic. Raz juz zrobilismy probna migracje na tomcat 5.5.28 i jedna aplikacja przestala poprawnie chodzic.
Niestet za duzo jest tam aplikacji i sa za duze, zeby az tak mocno eksperymentowac a potem wszystko testowac sprawdzac itp. To serwer produkcyjny i dosc "krytyczny" dla klienta.
No chyba, ze juz nic innego nie pomoze ;)Rafal M. edytował(a) ten post dnia 09.11.08 o godzinie 11:03
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Rafal M.:
hmm, czyli z tego co piszecie to wnioskuje, ze analiza narzedziami typu JProfiler nie ma sensu bo mi wogole nie pomoze. Natomiast, musze metoda prob i bledow robic update tomcata/jvm.
Myle, zeby najpierw sprawdzic z parametrami:
CMSPermGenSweepingEnabled
CMSClassUnloadingEnabled

Te dwie opcje działają jedynie gdy użyjesz CMS gc.
JVM nie bede uaktualnial bo juz jest najwyzszy w obrebie 1.5

Nie chodziło mi o zmianę wersji JVM na nowsza tylko zmianę vendora na JVM IBM'a lub JRokit'a.
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Proces Javy przeciaza CPU

Na spokojnie przemyśl. Zanim zaczniesz dodatkowo szarpać się z jakimiś narzędziami i ustawieniami.

To co się otwiera - powinno być zamknięte. Strumienie. Podobnie z JDBC, bibliotekami, na przykład do FTP i podobnymi.

Może za dużo równoległych procesów ?
Może za dużo otwartych strumieni lub połączeń z bazą danych ?
Może gdzieś powstaje jakiś długi raport, String, przeoczoną metodą + ?
(Z tym też raz miałem problem - zwalniało jak cholera. Tomcat pod Linux. Najciekawsze, że pod NT zwalniało ale nie było aż tak dramatycznie.)

Miewałem takie problemy i przyczyna, na końcu okazywała się trywialna.

Aha, w klasie Runtime jest parę metod na memory.
Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Hmm, gdyby to bylo, ze jakies nie zamkniete strumienia to na pewno nie powodowaloby przepelnienia permgen.
Igor Janicki:
Na spokojnie przemyśl. Zanim zaczniesz dodatkowo szarpać się z jakimiś narzędziami i ustawieniami.

To co się otwiera - powinno być zamknięte. Strumienie. Podobnie z JDBC, bibliotekami, na przykład do FTP i podobnymi.

Może za dużo równoległych procesów ?
Może za dużo otwartych strumieni lub połączeń z bazą danych ?
Może gdzieś powstaje jakiś długi raport, String, przeoczoną metodą + ?
(Z tym też raz miałem problem - zwalniało jak cholera. Tomcat pod Linux. Najciekawsze, że pod NT zwalniało ale nie było aż tak dramatycznie.)

Miewałem takie problemy i przyczyna, na końcu okazywała się trywialna.

Aha, w klasie Runtime jest parę metod na memory.
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Rafal M.:
Hmm, gdyby to bylo, ze jakies nie zamkniete strumienia to na pewno nie powodowaloby przepelnienia permgen.

Dokładnie. Wtedy by był Heap space.
Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Na serwerze testowym wywalilem wszystkie aplikacje i stworzylem nowa (bardzo prosta):
To jest zwykla jedna strona jsp, ktora przy wywolaniu robi:
1. Tworzy pusta liste
2. W petli (od 1 do 1000) tworzy obiekt i dodaje go do tej listy.
3. Na koncu wyswietla "Hello World".

Wywolywalem ta strone wieeeelokrotnie.

Co zaobserwowalem:
permgen sie zwiekszal ale jak dochodzil do pewnej wartosci to nagle ciutke spadal i tak wkolko.
Niby nic dziwnego ale ...
Na "zdrowy rozsadek" to powinien ladowac nowe klasy podczas startu tomcat'a i potem jeszcze przy 1 wywolaniu tej strony.
Natomiast permgen caly czas sie powieksza, ciut zmniejsza i potem znowu ...

Czy to jest prawidlowe zachowanie ?

Pozdrawiam,
Rafal
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Proces Javy przeciaza CPU

Rafal M.:
Na "zdrowy rozsadek" to powinien ladowac nowe klasy podczas startu tomcat'a i potem jeszcze przy 1 wywolaniu tej strony.
Natomiast permgen caly czas sie powieksza, ciut zmniejsza i potem znowu ...

Moim zdaniem powinien raz zaladowac i sie nie zmieniac (ewentulanie spadac). Moze zainstaluj "na boku" inna JVM nawet niech bedzie sun'a ale 1.6.x i zobacz jak wtedy Tomcat sie zachowuje. Mozesz tz to samo zrobic z Tomcatem, odaplic wersje 6.x.
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Rafal M.

Rafal M. Software Engineer,
Monachium

Temat: Proces Javy przeciaza CPU

Witajcie,

problem rozwiazalem juz jakis czas temu. Okazalo sie, ze jedna z bibliotek (a dokladnie Groovy) w wersji, ktora uzywalismy ma blad. Objawia sie wlasnie OutOfMemory w PermGenie. Zaladowalem nowsza wersje i problem znikna.

Bardzo dziekuje Wam (szczegolnie Krzyskowi) za bardzo konkretna i rzeczowa pomoc.

Pozdrawiam,
Rafal

Następna dyskusja:

Pozycja Javy na Polskim rynku




Wyślij zaproszenie do