Pamięć jest gwałtownie uwalniana każdego dnia o tej samej porze

10

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:

Dziwny 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.

António Sérgio Simões
źródło
2
Widzisz zwykłego śmieciarza lub pamięć podręczną czyszczącą IMHO. W jakim języku twoja strona jest gotowa? (może to być Twoja aplikacja, serwer WWW, a nawet system przeprowadzający pewne czyszczenie)
Tensibai
To było coś, co również podejrzewałem ... Jest to zrobione w ASP.NET MVC 4, więc teoria zbierania śmieci ma pewien sens. Na marginesie, zebrane przeze mnie dane dotyczące procesu w3wp i usługi Windows wyglądają zupełnie normalnie.
António Sérgio Simões
W ASP prawie nic nie wiem, ale zakładam, że istnieje sposób na zobrazowanie zużycia pamięci i wyrzucania elementów bezużytecznych, ponieważ w Javie powinno to pomóc upewnić się, że jest to główna przyczyna.
Tensibai

Odpowiedzi:

7

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.

Dave Swersky
źródło
Jest to rzeczywiście aplikacja .NET i z moich ostatnich badań wynika, że ​​wiele z tego, co napisaliście ty i @Tensibai, ma sens.
António Sérgio Simões
7

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:

Błędy Całkowita aplikacja ASP.NET Skok pamięci

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.

António Sérgio Simões
źródło
2
To jest znacznie bardziej prawdopodobne wytłumaczenie. Nagłe uwolnienie pamięci następuje prawie wyłącznie po ponownym uruchomieniu procesu. Mechanizmy do zwalniania pamięci uruchomionych procesów nigdy nie są tak ostre i rzadko faktycznie zwalniają pamięć, zamiast zwalniać trochę miejsca na wstępnie przydzielonej stercie.
Jiri Klouda