Przeskocz do opisu głównego

WebSphere - ręczne generowanie heap, thread i core dumpów

· 4 minut czytania
Sławomir Cichy
Backend Engineer @ Sci Software

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).

Uwaga!

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:

screen_02_pl

  1. Zrzut sterty (ang. Heap dump) - kliknięcie na przycisk spowoduje zrzut przestrzeni pamięci wykorzystywanej przez JVM.
  2. Podstawowy moduł Java (ang. Java core) - kliknięcie na przycisk spowoduje zrzut uruchomionych wątków.
  3. 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:

  1. Uruchomienie konsoli wsadmin:
cd /opt/IBM/WebSphere/AppServer/bin
./wsadmin.sh -user bpmadmin -password secret
  1. Będąc zalogowanym w konsoli wsadmin, wykonujemy ustawienie zmiennej jvm na obiekt reprezentujący JVM dla serwera aplikacyjnego, przykładowo, SingleClusterMember1:
wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=SingleClusterMember1,*]
  1. 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:

  1. Uruchomienie konsoli wsadmin:
cd /opt/IBM/WebSphere/AppServer/bin
./wsadmin.sh -user bpmadmin -password secret
  1. Będąc zalogowanym w konsoli wsadmin, wykonujemy ustawienie zmiennej jvm na obiekt reprezentujący JVM dla serwera aplikacyjnego, przykładowo, SingleClusterMember1:
wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=SingleClusterMember1,*]
  1. 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: