Mam kilka maszyn wirtualnych na Windows Azure, które prowadzą naszą witrynę e-commerce, a ostatnio zaczęliśmy używać Telegraf, InfluxDb i Grafana do monitorowania tych maszyn. Po kilku tygodniach zbierania danych zauważyłem dziwny wzorzec związany z danymi dostępnej pamięci :
Codziennie prawie zawsze o tej samej porze dnia zauważyłem, że uwalniana jest nagła ilość pamięci, która ze względu na moje bardzo, bardzo ograniczone umiejętności DevOp, nie jest w stanie zrozumieć, co to powoduje.
Oto wykres pokazujący ten wzór:
Moje pytanie brzmi: co może prowadzić do czegoś takiego? Czuję pokusę, by podejrzewać, że to wina wycieku pamięci, ale ... Wolna pamięć nigdy nie spada poniżej 70% i zdarza się tylko na dwóch maszynach wirtualnych o największym ruchu!
Czy powinienem się martwić, gdy widzę coś takiego?
PS: Zacząłem zbierać metryki dla prywatnych bajtów wirtualnych dla każdej z uruchomionych usług Windows i dla procesu w3wp ... chociaż przeczytałem, że te metryki nie są bardzo wiarygodne, aby dowiedzieć się, czy masz przeciek pamięci, ale przynajmniej postaram się uzyskać jakiś trend i sprawdzić, czy koreluje on ze wzorem pokazanym powyżej.
Odpowiedzi:
Ten sam wzorzec „piłokształtny” widziałem w innych systemach, w szczególności w narzędziu danych opartym na Javie. Na podstawie twojego opisu, myślę, że patrzysz na zbieranie śmieci .NET (zakładając, że jest to aplikacja .NET.) Java i .NET są językami zarządzanymi pamięcią i strukturami używającymi śmieciarek.
Wyciek pamięci jest zwykle w ramach których brakuje zarządzanie pamięcią, lub w programie w pamięci zarządzane ramy, które jest nadrzędne lub mylące śmieciarza.
To, że są to twoje serwery o największym ruchu, ma sens. Widzisz, jak platforma .NET przydziela pamięć w razie potrzeby, a następnie moduł czyszczenia pamięci uruchamia się w zwykłym cyklu i odzyskuje nieużywaną pamięć za pomocą algorytmów czyszczenia pamięci. Chyba że śledzisz określone problemy z wydajnością, nie sądzę, że ten wzorzec użycia pamięci jest problemem.
źródło
Myślę, że dowiedziałem się, dlaczego ten wykres wygląda tak.
Zbieram również wskaźniki dla aplikacji / błędów licznika całkowitej wydajności aplikacji ASP.NET i zauważyłem, że dokładnie w tym samym momencie, gdy następuje wzrost dostępnej pamięci, wskaźnik błędów całkowitych resetuje się do zera.
Według msdn licznik resetuje się do 0 za każdym razem, gdy nastąpi restart / zamknięcie aplikacji.
To prowadzi mnie do przekonania, że przyczyną tego wzoru piłokształtnych dostępnych pamięci jest ponowne uruchomienie aplikacji.
Oto jak wyglądają moje wykresy:
AKTUALIZACJA
Dzieje się tak, ponieważ prywatne bajty procesu W3WP osiągnęły limit recyklingu (w puli aplikacji skonfigurowano limit prywatnych bajtów). Patrząc uważnie na tabelę Private Bytes, widzimy, że dzieje się coś nienormalnego, ponieważ zużycie pamięci skacze z 650 MB do 3,2 GB, a kilka godzin później przeskakuje z 3,6 GB do 16,6 GB! Wtedy następuje recykling.
źródło