Jak sprawdzić co wywołuje długie czasy odpowiedzi mikroserwisu

0

Mam sobie mikroserwis napisany w javie + spring, który wystawia jakieś tam endpointy. Ruch jest dość spory (środowisko produkcyjne). Do tego mam metryki w grafanie (micrometer). Raz na jakiś pojawiają się piki w czasie przetworzenia żądania (czas wzrasta diametralnie). Np. średnio czas wykonania podobnych requestów wynosi on 100 ms, a czasami wzrasta na chwilę do 10-50 sekund, co nie powinno mieć miejsca. Na grafanie nie widzę, żeby w tym czasie wzrosło zużycie procesora. Patrząc na metryki GC widzę, że używany heap podniósł się nieznacznie (100 - 200 MiB), ale w w tym czasie wzrosła znacznie wartość metryk "jvm_gc_memory_allocated_bytes_total" (do 120 MB/s) i "jvm_gc_memory_promoted_bytes_total" (do 5 MB/s) (nie wiem czy to ma jakiś związek z tymi pikami). Serwis używa bazę danych do przetwarzania tych zapytań, ale nie widzę, żeby coś się działo na tych serwisach patrząc na ich metryki (obciążenie, czas wykonania zapytań itd.).

Pytanie brzmi, czy macie może jakieś sugestie jak znaleźć przyczynę tego problemu? Jakie metryki warto jeszcze sprawdzać / dodać? Polecacie jakąś literaturę, która by pomogła przy rozwiązywaniu tego typu problemów?

0

Jaka baza?
Sprawdź czy któreś z zapytań nie leci przypadkiem w ilości MxN dla dwóch tablic ewentualnie cała spora tablica.
W MySql jest polecenie explain ono pokazuje plan działania zapytania.

0

Baza to MongoDB.

3

Nie bawiłbym się w zgadywanie, tylko napisał porządne testy obciążeniowe i sprofilował aplikację.

3

Najważniejsze to czy możesz jakoś problem odtworzyć w izolowanych warunkach (testy?).
Jeśłi tak to zapuszczasz potem np. sampling (profiler) przy pomocy visualvm i masz duże szanse znaleźć.

Jeśli masz włączony gc log i widzisz korelacje między pikami a aktywnością gc - to możesz zobaczyć co się wtedy alokuje.
znowu visualvm się przydaje, albo jakiś pełnoprawny profiler. (używam Jprofiler osobiście - ale to troche kosztuje, na produkcjach mam monitoring np. dynatrace - ale to kosztuje absurdalnie zupełnie piwondze)

Nie ma się co bawić w zgadywanie - wielokrotnie widziałem, jak ludzie rzucali się na własnie optymalizowanie korzystania z bazy danych, gdzie tak naprawde bazada danych nie była niczemu winna - ale problem był np. w rzucaniu tonami exceptionów (które nawet nie muszą iść do loga, żeby obciążyć system).

1
  • masz jakieś długo żyjące obiekty (np. cache)?
  • jaki jest limit heap (Xmx)
  • jakie jest użycie heap?
  • jakie jest użycie old gena w zestawieniu z young genem (najlepiej to widać na jednym wykresie :))?

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