Java Profilers: Why You Need These 3 Different Types

Debugowanie problemów z wydajnością w produkcji może być bolesne, a w niektórych przypadkach niemożliwe bez odpowiednich narzędzi. Profilowanie Java istnieje od zawsze, ale profilery java, o których większość programistów myśli, są tylko jednego rodzaju: standardowe profilery JVM.

Jednakże używanie jednego rodzaju profilera nie jest wystarczające.

Załóżmy, że analizujesz wydajność swojej aplikacji. Istnieje wiele działań profilowania, które możesz wykonać. Ogólnie rzecz biorąc, standardowe profilery obsługują profilowanie pamięci, profilowanie CPU i profilowanie wątków.

Ale nawet z całym tym pokryciem, używając kombinacji wielu profilerów, znajdziesz więcej problemów z wydajnością. Dzieje się tak, ponieważ każdy profiler jest lepszy w pewnym aspekcie do ścigania błędów wydajnościowych.

Profiler Java

W tym poście, omówimy trzy rodzaje profilerów Java i dlaczego potrzebujemy ich wszystkich podczas tworzenia aplikacji. Zaczniemy od typów i zanurkujemy głęboko w każdy z nich.

Przyjrzyjmy się trzem różnym rodzajom profilerów Java:

  1. Standardowe profilery JVM, które śledzą każdy szczegół JVM (CPU, wątek, pamięć, zbieranie śmieci, itp.).
  2. Lekkie profilery, które podkreślają twoją aplikację z odrobiną abstrakcji.
  3. Narzędzia do zarządzania wydajnością aplikacji (APM) używane do monitorowania aplikacji na żywo w środowiskach produkcyjnych.
Nowe wezwanie do działania

Standardowe profilery JVM

Produkty takie jak VisualVM, JProfiler, YourKit i Java Mission Control.

Standardowy profiler Java z pewnością dostarcza najwięcej danych, ale niekoniecznie najbardziej użyteczne informacje. Zależy to od rodzaju zadania debugowania.

Profilery JVM będą śledzić wszystkie wywołania metod i użycie pamięci. To pozwala deweloperowi zanurkować w strukturę wywołań pod dowolnym kątem, który wybiorą.

Pros:

  • Doskonałe do śledzenia wycieków pamięci, standardowe profilery wyszczególniają całe wykorzystanie pamięci przez JVM i które klasy/obiekty są za to odpowiedzialne. Możliwość ręcznego uruchomienia zbierania śmieci, a następnie przeglądania zużycia pamięci może łatwo rzucić światło na klasy i procesy, które błędnie trzymają się pamięci.
  • Dobry do śledzenia użycia CPU, profiler Java zazwyczaj zapewnia funkcję próbkowania CPU, aby śledzić i agregować czas CPU według klas i metod, aby pomóc wyzerować gorące punkty.

Konsekwencje:

  • Wymaga bezpośredniego połączenia z monitorowaną maszyną JVM; to kończy się ograniczeniem użycia do środowisk programistycznych w większości przypadków. (Uwaga: niektóre profilery mogą pracować poza wątkami i zrzutami pamięci w ograniczony sposób.)
  • Spowalniają twoją aplikację; duża ilość mocy obliczeniowej jest wymagana dla wysokiego poziomu dostarczanych szczegółów.

Lekkie profilery transakcji Java

Produkty takie jak XRebel i Stackify Prefix.

Lekkie profilery przyjmują inne podejście do śledzenia aplikacji, wstrzykując się bezpośrednio do kodu.

  • Profile aspektowe wykorzystują programowanie zorientowane aspektowo (AOP) do wstrzykiwania kodu na początku i końcu określonych metod. Wstrzyknięty kod może uruchomić timer, a następnie zgłosić czas, jaki upłynął, gdy metoda się zakończy. Te profilery są proste do skonfigurowania, ale musisz wiedzieć co profilować. Dla przykładu, zobacz Spring AOP Method Profiling.
  • Profilery Java Agent używają Java Instrumentation API do wstrzyknięcia kodu do twojej aplikacji. Ta metoda ma większy dostęp do twojej aplikacji, ponieważ kod jest przepisywany na poziomie kodu bajtowego. Dzięki temu każdy kod uruchomiony w aplikacji może zostać zbadany – zarówno kod napisany przez użytkownika, jak i biblioteki innych firm, od których zależy aplikacja. Sprawdź to wprowadzenie do Java Agents, aby zobaczyć jak to wszystko działa.

Profilery Aspect są dość łatwe do skonfigurowania, ale są ograniczone w tym, co mogą monitorować i są obciążone przez wyszczególnienie wszystkiego, co chcesz, aby było śledzone. Agenci Java mają dużą przewagę w głębokości śledzenia, ale są o wiele bardziej skomplikowani do napisania.

Stackify Prefix jest profilerem Java zorientowanym na deweloperów, używającym metody profilera Java Agent za kulisami.

Fajną rzeczą jest to, że Prefix już zna najbardziej pożądane klasy i biblioteki stron trzecich, które deweloperzy chcą być instrumentowane – więc nie musisz ich wszystkich wyszczególniać. Dodatkowo, pobiera on wszystkie statystyki z instrumentacji i wyświetla je w prosty i zrozumiały sposób.

Jako przykład, podczas uruchamiania aplikacji wykorzystującej Hibernate, Prefix nie tylko wyszczególni czas, jaki upłynął dla zapytań, ale również wyświetli wartości parametrów dla generowanego SQL. Gdy aplikacja odwołuje się do SOAP/REST API, Prefix dostarcza treść żądania i odpowiedzi.

Przykład prefiksu profilera Java
Zrzut ekranu prefiksu: Tomcat Web Request Trace

Low Overhead, Java JVM Profiling in Production (APM)

Wszystkie dotychczasowe profilery były świetne do rozwoju, ale śledzenie, jak Twój system radzi sobie w produkcji, jest krytyczne.

Produkcja to zawsze inny krajobraz – konfiguracje rozwojowe i inscenizacyjne zazwyczaj nie mają tych samych zbiorów danych i obciążeń.

Narzędzia Java APM zazwyczaj używają metody profilera Java Agent, ale z innymi regułami oprzyrządowania, aby umożliwić im działanie bez wpływu na wydajność w produkcji. Sztuczka z tymi profilerami polega na dostarczeniu odpowiednich informacji w inteligentny sposób, aby nie zajmować cykli procesora.

Stackify’s Retrace jest narzędziem APM, które wykorzystuje tę samą technologię co Stackify Prefix z kilkoma dostosowaniami, aby działać płynnie w środowiskach inscenizacji i produkcji.

Odbywa się to poprzez agregację statystyk czasowych i próbkowanie śladów. Daje to wgląd na poziomie metody w kod aplikacji, który działa w produkcji.

Więc, gdy masz powolne żądanie sieciowe, przełoży się to na ślad pojawiający się w Retrace. Stamtąd możesz zanurkować i zobaczyć, które metody są winowajcą.

java profiler performance aggregation

Retrace Screenshot: Web Request Aggregation over 4 hours

java profiling tomcat trace
Retrace Screenshot: Tomcat Web Request Trace

Dlaczego potrzebujesz wszystkich 3 profilerów dla swojej aplikacji?

Standardowe profilery są dobre w znajdowaniu problemów z wydajnością na etapie rozwoju. Ale produkcja to już inny scenariusz. Zachowanie Twojej aplikacji może się zmieniać w oparciu o ruch przychodzący, żądanie serwera, odpowiedź i wiele innych rzeczy.

Więc, jakie jest rozwiązanie dla środowiska produkcyjnego? Odpowiedzią są narzędzia APM. Narzędzia APM celują w środowisko produkcyjne i dostarczają raporty dotyczące wydajności aplikacji.

Więc, standardowe profilery pomagają w rozwoju, a narzędzia APM pomagają w produkcji. Być może zastanawiasz się, jakie jest zapotrzebowanie na lekkie profilery transakcji.

Cóż, lekkie profilery stosują inne podejście do profilowania kodu. Są one wstrzykiwane bezpośrednio w kod – zwłaszcza na początku i końcu metody.

Są one również łatwe do skonfigurowania i zużywają stosunkowo mniej zasobów. Jest to bardzo przydatne w aplikacjach, które wykorzystują sprzętową pamięć transakcyjną. Te aplikacje wymagają wyrafinowanych narzędzi analitycznych, które wskazują dokładnie, która metoda lub funkcja powoduje problemy z wydajnością.

Niewątpliwie możemy powiedzieć, że jeśli tworzysz złożoną aplikację, będziesz potrzebował wszystkich trzech profilerów. Każdy typ profilera ma unikalne podejście do sprawdzania aplikacji pod kątem problemów z wydajnością.

Badanie przeprowadzone przez RebelLab wykazało również, że większość firm używa wielu profilerów kodu do znajdowania problemów z wydajnością w swoich aplikacjach.

Dlaczego niektóre profilery Java są tak drogie?

XRebel jest fajnym narzędziem, ale kosztuje 365$ rocznie. Stackify Prefix jest darmowy i zapewnia wiele z tych samych funkcji.

Największym problemem z rozwiązaniami APM jest zdecydowanie ich cena. Tradycyjnie były one tak drogie, że mogły sobie na nie pozwolić tylko największe przedsiębiorstwa.

Nie ma większego sensu wydawać około 100 dolarów miesięcznie na serwer w Azure lub AWS, a następnie wydawać prawie 200 dolarów miesięcznie na produkt taki jak New Relic.

Narzędzia monitorujące nie powinny kosztować więcej niż serwery!

Czytaj dalej: APM Pricing Is Now Affordable for All Developers, and Why They Should Care

Wrapping It Up

Teraz, gdy poznałeś trzy typy profilerów kodu Java, czas zdecydować, czy naprawdę potrzebujesz ich wszystkich.

Odpowiedź leży w naturze twojej aplikacji.

Jeśli jest mała, jak system zarządzania wydatkami lokalnego biznesu lub sklepu, profilowanie jest bardzo proste. Standardowy profiler załatwi sprawę.

Jeśli tworzysz aplikację internetową, taką jak system śledzenia przesyłek kurierskich, do Twojej aplikacji mogą mieć dostęp tysiące użytkowników. W takim przypadku będziesz również potrzebował narzędzi APM dla środowiska produkcyjnego.

Wreszcie, jeśli Twoja aplikacja jest przeznaczona dla systemów wbudowanych, będziesz potrzebował wszystkich trzech z nich.

Wybierz dobrze i baw się dobrze, tworząc aplikację, która zapewnia optymalną wydajność.

Start Free Trial

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.