2011-08-23 11 views
13

Jak napisałem w artykule Performance drop after 5 days running web application, how to spot the bottleneck?, mam problem z aplikacją, która działa powoli po uruchomieniu przez pewien czas.Jak używać VisualVM do wykrywania wąskiego gardła/problemu

Uruchomiłem VisualVM i zrobiłem migawkę między różnymi czasami. Teraz aplikacja jest bardzo powolna, ale nie mam pojęcia, jak rozpoznać wąskie gardło. Nie mają między sobą wielu różnic, a jedyną rzeczą, która trochę rośnie, jest Heap, który z powodzeniem zbiera śmieci po pewnym czasie.

Czy ktoś może mi podać jakieś wskazówki?

Oto migawki (aplikacje):

[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html

[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html

Dziękujemy!

EDYCJA: Przyglądam się bliżej, zauważyłem, że procesor nie jest nawet używany dużo ... i system jest naprawdę powolny!

+0

W drugim migawce (który jedzie ponad godzinę, podczas gdy pierwszy wychodzi ponad 4 sekundy tylko) istnieją pewne obciążenie CPU i prawie bez obciążenia stworzony przez GC. Jeśli wąskim gardłem jest procesor, powinieneś spróbować profilować, które metody to powodują. Możesz to zrobić również w jvisualvm. – ziggystar

+0

Na jakim serwerze aplikacji działa uruchomiona aplikacja? Czy to jest za front-endem serwera WWW? Jeśli tak, w jaki sposób są połączone 2 (który moduł). – atrain

Odpowiedz

4

W rzeczywistości istnieją lepsze narzędzia niż VisualVM.

Można spróbować JProfiler, który jest miły, ale profiler (płatne)

A może spróbować profilera Netbeans, który jest darmowy i działa świetnie

Z VisualVM będziesz tylko zobaczyć aktualny stan Twojej aplikacji (wykorzystanie pamięci i procesora, JMX, załadowane klasy, itp.).

+3

Są lepsze narzędzia; ale to nie znaczy, że potrzebujesz ich w tym przypadku (czego obecnie nie potrafię osądzić). JvisualVM zawiera również profiler (zarówno oprzyrządowanie, jak i próbkowanie) oraz profiler pamięci. Możesz także zainstalować dodatkowe wtyczki. – ziggystar

+0

@ziggystar Dobrze wiedzieć, nie wiedziałem o tym! –

6

Pierwszym krokiem byłoby wskazanie, co dokładnie jest wolne. Czy powoli wykonuje jakieś zadanie? Lub wykazuje niską przepustowość w obsłudze zleceń od różnych klientów?

Jakie zasoby są niewystarczające?

  • W przypadku korzystania z niektórych usług zewnętrznych (takich jak bazy danych lub serwera RPC) zawsze zalogować ich czas reakcji i sprawdzić je przed podjęciem jakichkolwiek innych czynności optymalizacyjnych.
  • Może to być brak mocy procesora. Wystarczy spojrzeć na użycie procesora.
  • Może to być brak pamięci. Aby wykryć tego rodzaju problemy, użyj rejestrowania gc. Jest na ten temat good topic.
  • To może być brak prędkości dysku twardego. Skorzystaj z limitów wydajności dysku twardego iostat.
  • Może to być brak przepustowości sieci. Sprawdź wykorzystanie kanału sieciowego.
  • Możliwe jest również, że zabraknie pewnych ograniczeń związanych z systemem operacyjnym, takich jak liczba otwartych plików i/lub gniazd sieciowych. Sprawdź, czy poprawnie raportujesz wszystkie wyjątki na poziomie systemu operacyjnego w plikach dzienników.

Po ustaleniu, który zasób jest niewystarczający, a także na temat części programu, który cierpi z tego powodu, można spróbować znaleźć fragment kodu do optymalizacji. Robienie losowego narzędzia i uruchamianie aplikacji bez wiedzy, czego szukać, nie ma sensu.

Z mojego osobistego doświadczenia wynika, że ​​bardzo rzadko zdarza się, gdy masz tylko powolną metodę, którą można znaleźć za pomocą profilera.Najprawdopodobniej jest to niespodziewane IO i/lub synchronizacja gdzieś w twoim algorytmie lub złym schemacie bazy danych.

0

Nie przyjmuję od razu, że jest to problem związany z twoją aplikacją, jeśli system oparty na systemie Windows patrzy na skaner antywirusowy, każdy program do planowania aktualizacji działający w tym czasie.

Upewnij się, że dzienniki są przewracane, a debugowanie jest prawidłowo filtrowane, aby nie wymknęły się spod kontroli.

Sprawdź migawki sql dla wszystkich długich uruchomionych zapytań. Sprawdź obciążenie DB i stertę DB.

Jeśli program Visual VM działa przez pewien czas, upewnij się, że masz kilka wątków gotowych do zaakceptowania pracy/połączenia będą wyświetlane jako żółte (bezczynne).

Strzał w ciemności Eclipse Memory Analyzer

Zrób zrzut sterty gdy można zauważyć spowolnienie i uruchomić go za pomocą analizatora.

Jeśli używasz systemu opartego na systemie uniksowym, sprawdź deskryptory plików ulimit -a, aby upewnić się, że proces java nie został zakończony.

Sprawdź ustawienia graniczne TCP bez opóźnienia i Nagle na serwerze

Powiązane problemy