Podczas przeprowadzania testów wydajnościowych czasami napotykamy sytuację, w której ich wyniki nie są zadowalające.
Pojawia się wtedy pytanie, jak sprawdzić, co dzieje się wewnątrz aplikacji i na co zużywa ona najwięcej czasu.
W takiej sytuacji możemy np.:
analizować logi,
analizować metryki, jeżeli aplikacja takie posiada,
zbierać metryki za pomocą agenta OpenTelemetry.
Innym sposobem jest uruchomienie samplera zbierającego statystyki z wątków pracujących w aplikacji.
W tym celu możemy użyć np. VisualVM. Kiedyś wchodził on w skład JDK, dlatego jest dość popularny.
Ma jednak pewną wadę - trzeba go podłączyć do działającego procesu javy, co może być utrudnione, jeżeli testy przeprowadzamy na środowisku,
do którego nie mamy takiego dostępu.
Wtedy z pomocą może przyjść nam JDK Flight Recorder – narzędzie wbudowane w JDK.
Warto zaznaczyć, że posiadają je także JDK budowane przez niezależnych dostawców.
Zbieranie danych
Aby uruchomić zbieranie danych za pomocą JFR, konieczne jest dodanie opcji uruchomieniowych dla testowanej aplikacji.
Na przykład jeżeli aplikacja wdrażana jest na serwerze Tomcat, możemy to zrobić poprzez edycję pliku bin/setenv.sh.
Do zmiennej CATALINA_OPTS dodajemy wówczas odpowiednią konfigurację:
W tym przypadku dane profilowania zostaną zapisane w pliku /var/log/profiling/profiling.jfr.
Profilowanie rozpocznie się po 240 sekundach od uruchomienia aplikacji (parametr delay) i potrwa 300 sekund (parametr duration).
Ważne, aby aplikacja miała uprawnienia do zapisu we wskazanym pliku.
Jako że zazwyczaj nie chcemy profilować samego startu aplikacji, w takiej sytuacji przydatne jest opóźnienie rejestrowania.
Zebrane dane możemy analizować za pomocą narzędzia JDK Mission Control dostępnego na stronie Oracle.
Z punktu widzenia analizy tego, gdzie aplikacja spędziła najwięcej czasu, interesować nas może ekran Java Application→Method Profiling,
który pokazuje najczęściej używane metody podczas samplowania wątków. Pamiętać należy o tym, żeby podczas zbierania danych uruchomione były testy,
które obciążają aplikację.