Jak prawidłowo monitorować pamięć JVM?

9

Zastanawiam się, jak monitorować pamięć JVM w sposób niewielki narzut w środowisku produkcyjnym, nawet w godzinach pracy.

Załóżmy, że mam dwa serwery aplikacji Tomcat w produkcji, a za nimi skonfigurowano równoważenie obciążenia. Jeśli widzę statystyki pamięci jvm, mogę powiedzieć, że saldo obciążenia przestanie wysyłać żądanie do serwera, który napotka problem OOM. Czy to ma sens? Jconsole lub VisualVM zjadają więcej zasobów wydajności nie jest moim wyborem.

Vance
źródło
Środowisko Java Simon może być warte spojrzenia.
khmarbaise

Odpowiedzi:

1

Inni przedstawili sugestie dotyczące monitorowania zużycia pamięci ...

Załóżmy, że mam dwa serwery aplikacji Tomcat w produkcji, a za nimi skonfigurowano równoważenie obciążenia. Jeśli widzę statystyki pamięci jvm, mogę powiedzieć, że saldo obciążenia przestanie wysyłać żądanie do serwera, który napotka problem OOM. Czy to ma sens?

Raczej. Ale niekoniecznie jest to najlepszy sposób na rozwiązanie problemu.

Pozwala cofnąć się do źródła problemu ... OOME. W kontekście Tomcat OOME mogą być spowodowane jedną z następujących przyczyn:

  • wycieki pamięci w Twojej aplikacji (lub ewentualnie w samym Tomcat),
  • próba przetworzenia zbyt wielu żądań równolegle na każdym Tomcat, lub
  • indywidualne żądania wymagające zbyt dużej pamięci podczas przetwarzania.

Aby rozwiązać problem, najpierw musisz dowiedzieć się, który z nich się dzieje ... ponieważ rozwiązanie jest inne dla każdego z nich.

1) Aby sprawdzić, czy jest to wyciek pamięci, musisz użyć narzędzia do analizy pamięci, aby sprawdzić wzorce wykorzystania pamięci długoterminowej. Prawdopodobnie pokaże to wzór piłokształtny ... co jest normalne. To, czego potrzebujesz, to poziom dna „zębów”, który z czasem rośnie. To wskazuje, że coś tworzy śmieci, których nie można zebrać; tzn. wyciek pamięci.

Jeśli masz wyciek pamięci, najlepszym rozwiązaniem jest ustalenie, która część kodu jest odpowiedzialna i naprawienie go. Wszystko inne ... w tym równoważenie obciążenia ... jest rozwiązaniem typu bandaid i może prowadzić do pogorszenia problemów na dalszym etapie.

2) Po wyeliminowaniu wycieków pamięci musisz dowiedzieć się, czy problem polega na tym, że przetwarzasz zbyt wiele żądań jednocześnie. Nie jestem pewien, jak najlepiej to zrobić, ale jeśli to jest problem (lub podejrzewasz, że tak jest), istnieje kilka możliwych rozwiązań:

  • Dostosuj konfigurację serwera Tomcat, aby zmniejszyć liczbę wątków roboczych.

  • Jeśli twoje żądania są związane z We / Wy, inną możliwością byłoby przyjrzenie się obsłudze asynchronicznej obsługi żądań dostępnej w najnowszych wersjach specyfikacji Servlet - patrz http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Ale to będzie więcej pracy.

3) Jeśli problem polega na tym, że niektóre żądania zużywają zbyt dużo pamięci, musisz dowiedzieć się, jak wykryć te żądania przed rozdaniem i „jak sobie z nimi poradzić”. Zarówno wykrywanie, jak i radzenie sobie z tymi żądaniami może być trudne ... i trudno jest doradzać bez szczegółów aplikacji. Ale kilka pragmatycznych rozwiązań to:

  • Przekaż anomalne żądania na inny serwer z dużą stertą ... gdzie OOME nie będą kolidować z „normalnymi” żądaniami.

  • Zwiększ rozmiar sterty. Jeśli masz wystarczającą ilość pamięci fizycznej, praca z większą stertą może faktycznie zwiększyć wydajność serwerów Tomcat ... a także uniknąć OOME.


Podsumowując, raczej próbując załadować równowagę, aby uniknąć OOME, sugeruję, aby dowiedzieć się, dlaczego otrzymujesz OOME ... i spróbuj bezpośrednio poradzić sobie z przyczyną OOME.

Stephen C.
źródło
0

Może jvmtop jest dla ciebie wart.

Pokazuje to w sposób „top-like” w oparciu o parametry monitorowania na jvm, takie jak zużycie pamięci, wykorzystanie procesora, liczba wątków itp.

MRalwasser
źródło