GC pause na żądanie

0

Jakieś pomysły jak w prosty sposób namówić JVM do zrobienia GC stop-the-world na określony czas? np. 10 sek, minutę, itp. ?

0

A po co chciałbyś to zrobić?

0

w sensie chcesz wywolac GC? https://stackoverflow.com/questions/1481178/how-to-force-garbage-collection-in-java ?
BTW watpie zeby stop-the-world mogl trwac az minute

2

Czy możesz rozwinąć? Co chcesz osiągnąć? Wiesz jak działa GC? Nie wystarczy?

kill -SIGSTOP PID
kill -SIGCONT PID

2

Strzelam, że to xy problem.
Ale może pytasz o to?
https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/VirtualMachine.html#suspend--

(Interface dla debuggerów)

0

Tak, to X/Y.

Analizuję problem pt. "losowe timeouty do serwisu X" w ramach testów wydajnościowych w środowisku hybrydowym (trochę aplikacji na k8s, trochę na wirtualkach). Przy 10k TPS leci np. 5-7 timeoutów na milion requestów i te timeouty są problemem. Koledzy z offshoru bardzo się przywiązali do koncepcji "trzeba tunować serwis X, bo wyraźnie widać, że mamy w logach time out i to nie problem u nas". Tymczase, serwer z tym serwisem bardzo się nudzi (obciążenie podczas testów: 5-10% CPU, brak waitów na I/O, brak błędów serwisu, timeoutów itp.). Aplikacja kliencka w Javie, więc mam taką hipotezę roboczą "GC pause czasem trwa > timeout na wywołanie serwisu i dlatego dostajecie losowe timeouty w komunikacji z serwisem X".

Nie mam żadnych dostępów do serwerów, wszystko odbywa się na zasadzie interakcji przez human-interface-over-teams:

  • Ja "Now, type: ls <and press enter>" ,
  • Interefejs: "Oooooh, it tells:
    ls: cannot access 'and': No such file or directory
    ls: cannot access 'press': No such file or directory
    ls: cannot access 'enter': No such file or directory
    "
    ...

Dlatego szukam prostego sposobu, żeby sobie po stronie klienta wygenerowali symulację GC pause i zobaczyli co im się pojawi w logach i na jaką skalę. Jak uwierzą w GC, to może nawet będą zainteresowani włączeniem logowania GC (póki co czekam cały dzień na info o wersji jvm ;-) ) i skorelowania tego z momentami timeoutów.

2

Te timeouty domyśłnie na http są na poziomie wielu sekund - więc może być tak, że GC (czy po stronie klienta, czy serwera) nie jest problemem. Może wstają serwisy na k8s i jest healthcheck średnio skonfigurowany (np. pierwszy prawdziwy request (nie health) trwa cholernie długo). Tony rzeczy może być problemem.

0

Tak, przyczyn może być wiele, ale testy przechodzą warmup, więc pody są wygrzane przed zapuszczeniem właściwego workloadu. Serwisem X w tym przypadku jest znana implementacja LDAPa w C.

Póki co, podejrzewam klienta :D Na serwerze, bufor Send-Q dla interefejsu sieciowego, po którym leci ruch od klienta, sugeruje, że klient niewystarczająco szybko odczytuje pakiety TCP (brak ACK). Jeśli to JVM, to bufor Recv-Q na kliencie powinien to potwierdzać (no ale na takie dane to poczekam sobie).

0

Jeżeli podjerzewasz GC to włącz sobie rozszerzone logi GC, wtedy dostanisz całe drzewo operacji które GC wykonuje i będzie od razu widać czy to GC czy nie GC, oraz jeśli to GC to co dokladnie (string dedup, czekanie na safepoint, dużo pamięci do zwolnienia itp).

Timeout w systemie rozproszonym to normalna rzecz o ile występuje w niewielkiej ilości. To mogą być problemy z DNS, problemy z siecią, problem z k8s lub zasobami, problem z dostawcą chmury, problem z Kafką itp. Jeżeli coś nie może zwrócić błędu bo timeout to należy stosować wzorce takie jak saga z retry, lub po prostu zwykłe retry lub przetwarzanie async (klient dostaje tylko status operacji a wynik może odebrać w innym endpointcie).

1
0xmarcin napisał(a):

Jeżeli podjerzewasz GC to włącz sobie rozszerzone logi GC, wtedy dostanisz całe drzewo operacji które GC wykonuje i będzie od razu widać czy to GC czy nie GC, oraz jeśli to GC to co dokladnie (string dedup, czekanie na safepoint, dużo pamięci do zwolnienia itp).

Timeout w systemie rozproszonym to normalna rzecz o ile występuje w niewielkiej ilości. To mogą być problemy z DNS, problemy z siecią, problem z k8s lub zasobami, problem z dostawcą chmury, problem z Kafką itp. Jeżeli coś nie może zwrócić błędu bo timeout to należy stosować wzorce takie jak saga z retry, lub po prostu zwykłe retry lub przetwarzanie async (klient dostaje tylko status operacji a wynik może odebrać w innym endpointcie).

może zacznij czytać

Dlatego szukam prostego sposobu, żeby sobie po stronie klienta wygenerowali symulację GC pause i zobaczyli co im się pojawi w logach i na jaką skalę. Jak uwierzą w GC, to może nawet będą zainteresowani włączeniem logowania GC (póki co czekam cały dzień na info o wersji jvm 😉 ) i skorelowania tego z momentami timeoutów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1