2010-02-11 13 views
7

Niedawno dowiedziałem się o scenariuszach, które wymagają rozgrzania aplikacji (z wymogiem dużej przepustowości), zanim zaczną obsługiwać rzeczywiste żądania. Logika, która za tym stoi, pozwoliła JIT wykonać magiczną wydajność!Rozgrzewanie aplikacji Java o wysokiej przepustowości

Czy jest to norma dla aplikacji Java, czy też dzieje się tak na ogół w aplikacjach o dużej pamięci (śladzie)?

+1

Dostrajanie wydajności polega nie tyle na "poznawaniu scenariuszy", ile na mierzeniu i analizowaniu, co się dzieje w ** twoich specyficznych scenariuszach. – flybywire

+0

Zobacz także moje pytanie: http://stackoverflow.com/questions/1481853/technique-or-utility-to-minimize-java-warm-up-time – noahlz

Odpowiedz

11

Jeśli mówisz o webapp/stronie internetowej o wysokim natężeniu ruchu, to JIT jest bardzo drobnym problemem. Największym problemem jest ocieplenie (wypełnienie) wszystkich warstw pamięci podręcznej, które musisz mieć. E.g ehcache regions which are being populated from hibernate. To dlatego, że operacje IO związane są rzędy wielkości wolniejsze niż cokolwiek, co dzieje się wewnątrz CPU (czyli chyba że jesteś liczące fraktale :)

+2

+1 dla "chyba że obliczasz fraktale". – z5h

+0

Dzięki za wskaźnik, ale myślę, że miałem na myśli rozgrzanie ścieżek kodu zamiast "drogich" danych. Szczególnie zastanawiałem się, czy sensowne jest, aby duże aplikacje Java były wstępnie nagrzewane, zwłaszcza biorąc pod uwagę, że maszyny JVM są dziś wystarczająco inteligentne, aby zdecydować, do której ścieżki kodu jest dostęp, a co za tym idzie, do pamięci podręcznej JIT dla nich itp. Z pewnością istnieje perf. hit po JITing po raz pierwszy i dlatego chciałem się dowiedzieć, czy w prawdziwym życiu ktoś stanął w obliczu tego problemu, który zachęciłby ich do rozgrzania swoich aplikacji, a jeśli tak, to w jakim celu. ulepszenia widziały. –

+1

@Aayush Puri: i moja odpowiedź brzmiała, że ​​jeśli mówisz o webappie, to rozgrzewka JIT jest ważna o 0,01%, więc w prawdziwym życiu (i w kontekście webappów) każdy ma większe problemy do rozwiązania (warmup dla bazy danych, pamięci podręcznych itp.) – cherouvim

5

Pytanie brzmi, kiedy chcesz wychodzić z sposób to zrobić ?

Jeśli uruchomisz aplikację internetową i NATYCHMIAST zakończysz jej działanie, to podczas "ocieplania" dodasz dodatkowe obciążenie, które przynosi efekt przeciwny do zamierzonego. Podobnie jest w przypadku uruchamiania aplikacji komputerowej. Nie ma sensu ocieplenie, jeśli użytkownik zacznie od razu go używać. Lub gorzej, nie pozwalając użytkownikowi na interakcję podczas ogrzewania aplikacji.

Jeśli uruchomisz aplikację webową i przetestujesz wdrożenie zanim zwrócisz do niego moduły równoważenia obciążenia, ogrzejesz je już jako wynik poboczny.

+0

Osobiście, robiąc to, robiłbym wszystko, żeby to zrobić. Lub gdy mam klaster i rozgrzewanie komputera przed podłączeniem go do klastra nie ma wpływu na użytkowników. –

+0

Ale jeśli twoje środowisko produkcyjne nie ma korzyści z rozgrzania, dlaczego chcesz skreślić wyniki testu wydajności przez rozgrzanie w środowisku testu wydajności? – zkarthik

+0

Całkowicie zgadzam się, że rozgrzanie aplikacji ma sens tylko przed dodaniem jej do systemu równoważenia obciążenia. –

4

Oprócz cherouvim's answer, mogę pomyśleć o kilku innych kwestiach, które wymagają rozgrzewkę:

  • Objects instancji (lazy loading, singletons etc.);
  • Przydział sterty (jeśli twoja Xms jest mniejsza niż twoja Xmx).

Wyobrażam sobie, że system operacyjny dostosowuje się również do działania aplikacji, więc na wywołania systemu operacyjnego może również wpływać okres rozgrzewania.

Większość powyższych (populacja pamięci podręcznej, inicjalizacja obiektu) nie są specyficzne dla Javy.

+0

+1: Dużą rolę może mieć populacja pamięci podręcznej plików w systemie operacyjnym. – erickson

+0

> Przydział sterty (jeśli twoje Xms jest mniejsze niż Xmx). Dobra uwaga. I wierzę, że właśnie dlatego mówi się, aby ustawić Xmx = Xms –

Powiązane problemy