2013-04-29 13 views
8

W kontekście miękkiego systemu czasu rzeczywistego, który nie powinien zatrzymywać się na dłużej niż 200 ms, Szukamy sposobu, aby uzyskać wcześniejsze ostrzeżenie przed zbliżającym się pełnym GC. Zdajemy sobie sprawę, że możemy nie być w stanie tego uniknąć, ale chcielibyśmy przejść do innego węzła, zanim system się zawiesza.Otrzymywanie ostrzeżenia z wyprzedzeniem przed pełnym GC

Udało nam się wymyślić schemat, który zapewni nam wcześniejsze ostrzeżenie przed nadejściem pełnej wartości GC, co może spowodować zatrzymanie systemu na kilka sekund (czego musimy unikać).

To, co udało nam się wymyślić, opiera się na statystykach darmowej listy CMS: -XX:PrintFLSStatistics=1. To drukuje statystykę z listy darmowej do dziennika GC po każdym cyklu GC, w tym młodym GC, więc informacje są dostępne w krótkich odstępach czasu i będą pojawiać się jeszcze częściej w odstępach o wysokiej alokacji pamięci. Prawdopodobnie kosztuje trochę pod względem wydajności, ale naszym roboczym założeniem jest to, że możemy sobie na to pozwolić.

Wyjście do dziennika wygląda tak:

Statistics for BinaryTreeDictionary: 
------------------------------------ 
Total Free Space: 382153298 
Max Chunk Size: 382064598 
Number of Blocks: 28 
Av. Block Size: 13648332 
Tree  Height: 8 

W szczególności, maksymalna wielkość wolny kawałek jest 382064598 słowa. W przypadku słów 64-bitowych wartość ta powinna wynosić nieco poniżej 2915 MB. Liczba ta zmniejsza się bardzo powoli, z szybkością około 1 MB na godzinę.

Rozumiemy, że tak długo, jak maksymalny rozmiar wolnej części jest większy niż młode pokolenie (zakładając, że nie ma humidystycznego przydzielania obiektów), każda promocja obiektu powinna odnieść sukces.

Niedawno przeprowadziliśmy kilkutygodniowe testy obciążeniowe i zauważyliśmy, że CMS był w stanie utrzymać maksymalne porcje w górę w stosunku do 94% całkowitej przestrzeni starego regionu. Wydaje się, że maksymalny rozmiar porcji maleje z szybkością mniejszą niż 1 MB/godz., Co powinno być w porządku - w związku z tym nie dojdziemy do pełnego GC w najbliższym czasie, a serwery najprawdopodobniej zostaną wyłączone z powodu konserwacji więcej często może wystąpić pełny GC.

W poprzednim teście, w czasie, gdy system był mniej wydajny pod względem pamięci, byliśmy w stanie uruchomić system na dobre 10 godzin. W ciągu pierwszej godziny maksymalny rozmiar wolnej części zmniejszył się do 100 MB, gdzie pozostał przez ponad 8 godzin. W ciągu ostatnich 40 minut biegu maksymalny rozmiar wolnej części spadł ze stałą prędkością w kierunku 0, gdy wystąpił pełny GC - było to bardzo zachęcające, ponieważ w przypadku tego obciążenia wydawało się, że jesteśmy w stanie uzyskać 40-minutowy postęp ostrzeżenie (gdy wielkość porcji zaczęła się zmniejszać w kierunku 0).

Moje pytanie do was: zakładając, że to wszystko odzwierciedla obciążenia długotrwałego obciążenia szczytowego (w danym punkcie w czasie produkcji będzie tylko niższe), to brzmi jak ważny podejście? Do jakiego stopnia niezawodności liczycie, że powinniśmy móc liczyć na maksymalną statystykę rozmiaru porcji z dziennika GC?

Jesteśmy zdecydowanie otwarci na sugestie, ale prosimy o ograniczenie ich do rozwiązań dostępnych w HotSpot (przynajmniej dla nas Azul, przynajmniej na razie). Również G1 samo w sobie nie jest rozwiązaniem, chyba że możemy wymyślić podobną metrykę, która da nam wcześniejsze ostrzeżenie przed Pełnymi OW lub dowolnymi OW, które znacznie przewyższają naszą SLA (i czasami mogą się zdarzyć).

+0

Czy możliwe jest przetestowanie JRockit Deterministic GC? http://docs.oracle.com/cd/E15289_01/doc.40/e15071/intro.htm#i1010645 – fglez

+0

Jesteśmy tego świadomi, podobnie jak inne oferty IBM w czasie rzeczywistym i Oracle. Ważne jest, abyśmy mieli słabsze gwarancje (lub nawet heurystyki), które umożliwiają nam wdrożenie również w HotSpot. – nadavwr

+2

Czy rozważałeś wymuszenie okresowego pełnego GC na naprzemiennych węzłach? To pozwoliłoby na bardziej przewidywalne zachowanie. CMS nie jest przewidywalny w dłuższej perspektywie w miarę rozrastania się fragmentacji. – fglez

Odpowiedz

2

Zamieszczam tutaj odpowiednie fragmenty bardzo pouczającej i zachęcającej odpowiedzi Jona Masamitsu z Oracle, którą dostałem z listy mailingowej HotSpot GC ([email protected]) - pracuje on w HotSpot , więc to naprawdę bardzo dobra wiadomość.

W każdym razie pytanie pozostaje otwarte do tej pory (nie mogę sobie pozwolić na cytowanie e-maila :-)), więc proszę dodać swoje sugestie!

Formatowanie: cytaty z oryginalnego wpisu są bardziej wcięte niż odpowiedzi Jona.

To nasze zrozumienie, że tak długo, jak maksymalna wolnej wielkości porcja jest większa niż młodego pokolenia (zakładając brak humungous obiekt alokacji), każda promocja obiekt powinien odnieść sukces.

W bardzo dużym stopniu jest to prawda. Istnieją okoliczności pod numerem , w którym obiekt promowany z młodego pokolenia do generacji CMS będzie wymagał więcej miejsca w generowaniu CMS niż w młodym pokoleniu. Nie sądzę, że tak się dzieje w znacznym stopniu.

Powyższe jest bardzo zachęcające, ponieważ możemy definitywnie poświęcić trochę wolnej pamięci, aby chronić się przed rzadkimi opisywanymi przez niego przypadkami, i wygląda na to, że inaczej byśmy zrobili.

< --snip ->

Moje pytanie do was: zakładając, że to wszystko odzwierciedla przedłużoną szczyt obciążenia (obciążenie w danym punkcie w czasie produkcji będzie tylko być niżej), czy to brzmi jak prawidłowe podejście? Do jakiego stopnia niezawodności szacujemy, że powinniśmy być w stanie liczyć na maksymalną wielkość statystyczną rozmiaru porcji z dziennika GC?

Maksymalny rozmiar wolny kawałek jest dokładna w momencie GC odbitek, ale to może być czerstwy do czasu można go odczytać i uczynić swoje decyzje.

Dla naszych obciążeń, to metryka jest na bardzo powolny spiralę, więc trochę staleness nam nie zaszkodzi.

< --snip ->

Jesteśmy zdecydowanie otwarty na sugestie, ale wnioskować o ich ograniczony do rozwiązań dostępnych na HotSpot (nr Azul dla nas, przynajmniej na teraz). Samo G1 samo w sobie nie jest rozwiązaniem, chyba że możemy wymyślić podobną metrykę, która da nam ostrzeżenie przed Pełnymi GC lub GC, które znacznie przekraczają naszą SLA (i czasami mogą wystąpić ).

myślę, że użycie maksymalnej wolnej wielkość porcji jako metryki jest dobrym wyborem. Jest bardzo konserwatywny (co brzmi jak to, co chcesz) i nie podlega dziwnym mieszankom wielkości obiektów.

Dla G1 myślę, że można użyć liczby całkowicie wolnych regionów. Nie wiem, czy jest wydrukowany w którymkolwiek z dzienników, ale jest to prawdopodobnie metryka, którą utrzymujemy (lub możemy łatwo). Jeśli liczba całkowicie wolnych regionów maleje z czasem, może to oznaczać, że nadchodzi pełny GC.

Jon

Dziękuję Jon!

0

Dziel i zwyciężaj!

Twój system zużywa dużo pamięci i musi reagować szybko. Więc przeprojektuj architekturę swojego systemu, aby uzyskać stoisko.

Określ najważniejsze zadanie w czasie rzeczywistym i reguły biznesowe, aby utworzyć dla niego proces Java.I użył na tym jakiejkolwiek niekonwencjonalnej praktyki programistycznej, idea nie zależy od GC, aby zachować czystość pamięci. Pomyśl o tym i bądź kreatywny.

Teraz utwórz inne warstwy i procesy, aby obsłużyć pozostałe i zbuduj kod potoku, aby połączyć wszystko.

Nawet ty możesz zaplanować życie w czasie rzeczywistym lub sprawdzić czas reakcji, aby go zabić i stworzyć nowy. Ale mogę się spodziewać, że nie będziesz musiał go zabijać, aby zachować wysoką reakcję.

Powodzenia!

Powiązane problemy