2016-05-03 11 views
6

Próbuję dostroić moją aplikację głównie w celu zmniejszenia "rozprzestrzeniania się" czasów odpowiedzi. Średnia jest dobra, ale zakres jest zbyt szeroki.Strojenie JVM dla wysokiej alokacji

Dynatrace wykazało, że wyższe czasy reakcji są związane z większą ilością czasu spędzanego w zawieszeniu. To wskazuje na GC.

Próbowałem zmienić niektóre wartości JVM GC na podstawie czytania w Internecie, do małego sukcesu.

Na podstawie logów GC uznałem, że współczynnik alokacji wynosi około 324 MB/s, a współczynnik promocji to tylko 0,85 MB/s. Wydaje mi się, że ma on bardzo wysoką stopę przydziałów, więc starałem się zwiększyć rozmiar Młodej Generacji.

Pierwszy zrzut ekranu zawiera domyślne ustawienia Java 8, 1024 MB Xmx.

Drugi zrzut ekranu to ustawienie NewRatio = 1.

Wszelkie sugestie dotyczące tego, co warto spróbować, będą naprawdę mile widziane.

Czego już próbowałem: zmiana na G1GC ustawienie NewRatio = 1, ustawienie NewRatio = 1 i rosnącą xmx 2048, ustawienie NewSize = 1600m i xmx = 2048, ustawienie MetaspaceSize = 100

EDIT: Dodawanie kłody GC http://pastebin.com/VhJwSuxv

Uwaga: Ścieżki te pochodzą z badania 10min ze zmianą: NewRatio = 1

enter image description here enter image description here

+1

* "W oparciu o dzienniki GC" *, opublikować je? – the8472

+0

Dodano link do pastebin z logami GC. Zauważ, że są one ze zmianą: NewRatio = 1 – Bobby

+0

Młode kolekcje zapewniają dość stałą przerwę 70-80ms. Stare kolekcje trwają dłużej, ale są rzadkie i należy się tego spodziewać, gdy używasz kolektora danych. Dlatego prawdopodobnie powinieneś bardziej szczegółowo przyjrzeć się środkom reagowania, aby zweryfikować, że są one faktycznie powiązane z GC. – the8472

Odpowiedz

3

Przed strojeniem GC należy najpierw użyć profilera pamięci, aby zmniejszyć szybkość przydzielania.

Możesz spróbować zwiększyć młodą generację, np. możesz ustawić -Xmn2g -Xmx3g i nie ustawiać NewRatio.

Mam zorientowali stopa alokacji na około 324 MB/s,

To umiarkowane tempo dla aplikacji WWW. Może być niższy, ale nie spodziewałbym się poważnych problemów na tym poziomie.

Zacznę od dużo większej sterty w zależności od pamięci używanej przez komputer np. -Xmn24g -Xmx32g i spójrz na czasy pauzy. Następnie zmniejsz wielkość sterty, aż wydaje się, że wpływa na czasy GC (może nawet się skrócić).

Inny sposób patrzenia na to; Może się okazać, że dopuszczalne jest posiadanie małego GC co 2 do 10 sekund. Oznacza to, że potrzebujesz przestrzeni Eden od 650 MB do 3,2 GB.

+0

Dzięki za odpowiedź. Czy możesz podać mi przykład "profilera pamięci", który sugerujesz? Używam VisualVM. Nie udało się uzyskać jstatd pracy na serwerze zdalnym. Spróbuję z dużo większymi Xmx i Xmn, jak sugerujesz. Próbowałem z NewSize = 1600/Xmx = 2048, co zmniejszyło nieznaczną częstość gc z każdej od 1 do 4, jednak długość tych gc trwała około 3 razy tyle, co miało ogólny negatywny wpływ na perf. – Bobby

+0

@Bobby Chciałbym wypróbować FlightRecorder. Można go uruchomić z wiersza poleceń i podać dużo więcej szczegółów na temat działania aplikacji. –

+1

OK Próbowałem twojej sugestii z dużo większym stosem i różnymi nowymi rozmiarami i osiągnąłem wynik, który daje pewien wzrost wydajności i poprawioną spójność. Następny będzie FlightRecorder. Jeszcze raz dziękuję za odpowiedzi! – Bobby