WebSphere - ręczne generowanie heap, thread i core dumpów
Mamy problem wydajnościowy aplikacji Java zainstalowanej na IBM WebSphere i co robić? Przede wszystkim w analizie przydatnymi są dane zgromadzone w tak zwanych plikach dump'ów (zrzutów).
Aby rozwiązać problem wydajnościowy, generowanie plików zrzutów ma sens tylko w trakcie trwania tego problemu. Pliki te przechowują stan "obecny" JVM (Maszyny Wirtulanej Java), nie przechowują historii wykonanych operacji. Zatem generowanie plików po zdarzeniu "awarii" nie pomoże nam w jej analizie.
Mamy trzy rodzaje plików zrzutów jakie możemy uzyskać podczas występowania problemów wydajnościowych:
- Zrzut sterty (heap dump) - zrzut przestrzeni pamięci wykorzystywanej przez JVM.
- Zrzut wątków (thread dump, javacore) - zrzut uruchomionych wątków.
- Zrzut systemowy (core dump) - zrzut operacji wykonywanych przez proces w ramach systemu operacyjnego.
Jak wykonać ręczny zrzut plików? Poniżej moim zdaniem najprostsze metody.
Wykorzystanie konsoli WebSphere Integrated Solutions Console
Uruchamiamy w przeglądarce konsolę WebSphere Integrated Solutions Console (dostępna pod adresem https://<nazwa_servwera>:<port>/ibm/console
, gdzie <port>
najczęściej to wartość 9043
).
Ścieżka konfiguracji w konsoli WebSphere: Rozwiązywanie problemów > Podstawowe moduły oraz zrzuty Java
Zaznacz serwer, na którym występuje problem wydajnościowy.
Poniższa ilustracja pokazuje elementy strony konsoli:
- Zrzut sterty (ang. Heap dump) - kliknięcie na przycisk spowoduje zrzut przestrzeni pamięci wykorzystywanej przez JVM.
- Podstawowy moduł Java (ang. Java core) - kliknięcie na przycisk spowoduje zrzut uruchomionych wątków.
- Zrzut sytemowy (ang. Core dump) - kliknięcie na przycisk spowoduje zrzut operacji wykonywanych przez proces w ramach systemu operacyjnego.
Zobacz film, na którym prezentuję akcję pobierania zrzut uruchomionych wątków na serwerze WebSphere:
Wykorzystanie linii poleceń (SSH)
W przypadku, gdy nie mamy dostępu do konsoli WWW WebSphere, możemy wykonać zrzuty z poziomu linii poleceń.
Załóżmy, że nasz serwer WebSphere działa na systemie Linux. Jest on zainstalowany w katalogu /opt/IBM/WebSphere/AppServer
.
Nazwa uzytkownika administracyjnego to bpmadmin
, a hasło to secret
.
Zrzut sterty (heap dump) z wykorzystaniem wsadmin
Wykonamy następujące polecenia w celu zrzucenia sterty:
- Uruchomienie konsoli
wsadmin
:
cd /opt/IBM/WebSphere/AppServer/bin
./wsadmin.sh -user bpmadmin -password secret
- Będąc zalogowanym w konsoli
wsadmin
, wykonujemy ustawienie zmiennejjvm
na obiekt reprezentujący JVM dla serwera aplikacyjnego, przykładowo,SingleClusterMember1
:
wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=SingleClusterMember1,*]
- Wykonujemy zrzut sterty:
wsadmin>$AdminControl invoke $jvm generateHeapDump
Zrzut wątków (thread dump, javacore) z wykorzystaniem wsadmin
Wykonamy następujące polecenia w celu zrzucenia wątków:
- Uruchomienie konsoli
wsadmin
:
cd /opt/IBM/WebSphere/AppServer/bin
./wsadmin.sh -user bpmadmin -password secret
- Będąc zalogowanym w konsoli
wsadmin
, wykonujemy ustawienie zmiennejjvm
na obiekt reprezentujący JVM dla serwera aplikacyjnego, przykładowo,SingleClusterMember1
:
wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=SingleClusterMember1,*]
- Wykonujemy zrzut wątków:
wsadmin>$AdminControl invoke $jvm dumpThreads
Zrzut wątków (thread dump, javacore) z wykorzystaniem kill
Najprościej jednak jest wykonać zrzut wątków z wykorzystaniem polecenia kill
, wysyłając odpowiedni sygnał do działającego procesu JVM.
Abu zrzucić javacore'a (zrzut wątków) używamy sygnału 2
, wydajemy polecenie:
kill -2 <PID>
Aby zrzucić javacore'a, systemcore oraz plik Snapshot uzywamy sygnału 6
, wydajemy polecenie:
kill -6 <PID>
gdzie <PID>
to identyfikator procesu JVM, który można odczytać z pliku <nazwa_serwera>.pid
znajdującego się w katalogu profiles/<nazwa_profilu>/logs/<nazwa_serwera>
,
przykład: profiles/Node1Profile/logs/SingleClusterMember1/SingleClusterMember1.pid
. PID można odczytać również wykorzystując polecenie ps -ef | grep java
.
Przydatne linki i materiały
Poniższe linki prowadzą do stron wsparcia IBM, gdzie znajdziesz więcej informacji na temat generowania zrzutów w IBM WebSphere. Aby uzyskać do nich dostęp, wymagane jest posiadanie konta w serwisie IBM:
- How to manually generate a Heapdump in WebSphere on Windows.
- How to generate javacores/thread dumps, heapdumps and system cores for the WebSphere Application Server Liberty profile.