Coś zjada całą pamięć (podejrzewam przeciek pamięci w niektórych aplikacjach). Jak wykryć co?

16

Mam serwer, na którym działa pakiet liquidsoap + icecast i prosta strona internetowa (httpd + mysqld). Nic specjalnego. Odwiedzający około 2000+ dziennie, przy czym średnio 50 osób jest jednocześnie online.

Serwer ma 8 GB pamięci RAM. Z biegiem czasu ilość wolnej pamięci stale maleje, chociaż na serwerze nie rozpoczyna się nic nowego i nie ma nowych użytkowników. W pewnym momencie zaczyna się zamieniać, obciążenie serwera rośnie i przestaje odpowiadać. Zwykle po prostu restartuję serwer ...

Co można zrobić, aby wykryć, co dokładnie wycieka pamięć? Używam góry do monitorowania zużycia zasobów, ale o ile widzę, nie pokazuje nic pomocnego:

wprowadź opis zdjęcia tutaj

Czy jest jakiś sposób, aby dowiedzieć się, co wykorzystuje tyle pamięci? lub co zaczyna się intensywnie zamieniać na dysk? Jakiś sposób na zwolnienie pamięci bez ponownego uruchamiania serwera?

jayarjo
źródło
Czy jest jakiś powód, dla którego nie próbujesz ponownie uruchomić niektórych usług (apache, liquidsoap) zamiast serwera?
jamespo
Pierwotnie odpowiedziałem na normalne użycie pamięci. Zaktualizowałem o zestaw narzędzi, które mogą pomóc zidentyfikować problem.
BillThor
@ jamespo, faktycznie próbowałem, ale nie przyniosło to efektu, więc ponowne uruchomienie było jedyną rzeczą, o której wiedziałem, że może pomóc.
jayarjo,
Pamięć podręczna 4027092k powinna wyjaśniać użycie pamięci, nie? W tej chwili pracuję nad podobnym problemem gdzie indziej i do tej pory udało mi się dowiedzieć, że transfer pamięci można regulować za pomocą następujących parametrów: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio To nie jest pełna poprawka i żadne opinie mile widziane. Mam nadzieję, że to właściwy kierunek.

Odpowiedzi:

16

Działając topw trybie wsadowym w celu okresowego raportowania wielkości pamięci, można sprawdzić, kto korzysta z pamięci, gdy rzeczy idą na południe. Uruchomienie sarw trybie wsadowym powinno dać dobrą diagnostykę dotyczącą użycia pamięci i powiązanych operacji we / wy. Uruchomienie w munincelu monitorowania systemu powinno dać ci wykres z dokładnymi szczegółami, do czego używana jest pamięć. To może bardzo pomóc.

Możesz użyć limit.conf, aby ograniczyć maksymalny rozmiar rdzenia programów. Prawidłowo ustawiony, powinien zabić wszelkie programy, które przeciekają pamięć. Działa to z modułem pam_limits. Granice można również ustawić za pomocą ulimitspolecenia.

Używasz kilku programów, które mogą zużywać duże ilości pamięci. Oto niektóre rzeczy, na które możesz spojrzeć.

  • Źle zaprogramowane aplikacje działające pod apache2mogą wyciekać pamięć. Gdy tak się stanie, powinieneś zobaczyć wzrost wielkości pamięci. Możesz nastroić apache2, aby przetwarzać dzieci po określonej liczbie zastosowań, ustawiając MaxRequestsPerChildna około 100. Jeśli to rozwiąże problem, musisz usunąć wyciek. Najpierw obejrzałbym to.
  • MySQL może próbować załadować dane do pamięci. Jeśli masz dużo danych w pamięci, może to powodować druzgocenie, ale nie powinno być tak dramatyczne, jak widzisz.
  • Jeśli masz zamontowany duży tmpfssystem plików, możesz wyciec pamięć, jeśli pliki nie zostaną usunięte podczas używania. Problemem mogą być również duże, długo żyjące pliki.
  • Jeśli problem występuje mniej więcej o tej samej porze dnia, możesz mieć zaplanowany program, który przecieka pamięć.
  • Jeśli masz program, który przydziela pamięć współdzieloną, ale nie zwalnia jej przed wyjściem, będziesz miał stosunkowo niewidoczny wyciek pamięci. Jeśli pamięć współdzielona jest zablokowana w pamięci, może wymusić zamianę. Ilość dostępnej pamięci współdzielonej jest zwykle stosunkowo ograniczona.
  • Pakiet liquidsoap + icecast może napotykać problemy z buforowaniem, które wykorzystują pamięć. Nie użyłem tej kombinacji, więc nie jestem pewien, jak by to wyglądało.

Normalne użycie pamięci: wolna pamięć nie jest czymś, czego bardzo chcesz. Jeśli twój system działał od dłuższego czasu i ma dużo wolnej pamięci, coś jest nie tak. Za każdym razem, gdy czytasz lub zapisujesz plik, bloki przechodzą do bufora pamięci podręcznej. Zmniejszy to twoją wolną pamięć i jest dobrą rzeczą. System zachowa wystarczającą ilość wolnego miejsca, aby uruchomić kilka programów bez szukania pamięci w innym miejscu. Ponieważ wiele programów działa szybko, ich pamięć zostanie zwrócona do wolnej puli, gdy przestaną działać.

Podczas odczytywania pliku znajdującego się w pamięci podręcznej bufora dostęp do dysku nie jest wymagany, a odczyt jest rozstrzygany z pamięci podręcznej bufora. Pisze używają podobnego mechanizmu. Jeśli system potrzebuje pamięci, pamięć podręczna bufora jest jednym z pierwszych używanych miejsc. Większość buforów można zwolnić natychmiast.

Jeśli masz wyciek pamięci, zobaczysz wolną pamięć, a bufory zaczną się kurczyć. To nadal nie jest poważny problem, ponieważ wyciek pamięci powinien ostatecznie zostać przeniesiony na przestrzeń wymiany. Twój system będzie nadal działał poprawnie, dopóki nie wypełnisz przestrzeni wymiany i nie wykorzystasz pozostałego wolnego miejsca do punktu, w którym nie można uruchomić programów. Zazwyczaj można użyć niewielkiej ilości przestrzeni wymiany.

BillThor
źródło
Problem w moim przypadku jest trochę dziwny. Nawet gdy obciążenie jest ogromne, a serwer mocno zamienia się, jest mnóstwo wolnej pamięci (co zrozumiałem po przeczytaniu o buforach i pamięciach podręcznych). top nie pokazuje coraz więcej pamięci blokującej procesy. Ale obciążenie rośnie i w pewnym momencie serwer staje się bezużyteczny: | Dziękuję za szczegółową odpowiedź.
jayarjo,
2
@jayarjo: Munin i sar powinny pomóc wykryć, co się dzieje. Jeśli masz dużo wolnej pamięci, nie powinieneś zamieniać. Być może masz inny problem z wejściem / wyjściem. sarpomoże wskazać, która partycja ma we / wy i może pomóc w wykryciu problemu.
BillThor
+1 za poradę
MaxRequestsPerChild
11

Możesz użyć tego polecenia, aby zobaczyć 10 najlepszych aplikacji dotyczących użycia pamięci RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

Czasami to polecenie pomaga, jeśli wygenerowano wiele podprocesów:

ps auxf

W ten sposób możesz zobaczyć, które procesy należą do siebie.

Raffael Luthiger
źródło
To są przydatne polecenia, dzięki czemu zanotuję je na przyszłość. Problem polega jednak na tym, że na górze zawsze znajdują się te same procesy (można je zobaczyć na załączonym zrzucie ekranu) - apache, mysql, liquidsoap, icecast. I używają (lub przynajmniej pokazują, że używają) tej samej ilości pamięci (tak naprawdę nieistotnej), nawet gdy serwer umiera z obciążenia: |
jayarjo,
@jayarjo: Czy zmienia się liczba procesów? Czy masz dużo więcej procesów? I czy jest to serwer fizyczny czy wirtualny?
Raffael Luthiger
Nie zauważyłem żadnej zmiany liczby procesów. Zasadniczo, kiedy robię top, gdy serwer umiera z obciążenia, widzę bardzo podobny obraz do tego, co załączyłem w pierwotnym pytaniu, z wyjątkiem ogromnego obciążenia: | Serwer jest fizyczny.
jayarjo,
2
Spróbuj uzyskać więcej informacji za pomocą „vmstat” (np. Vmstat -s). Lub za pomocą wspomnianego już narzędzia „sar”. Czy masz system plików oparty na pamięci RAM? Może więc „iostat” może również podać więcej informacji.
Raffael Luthiger,
1
Miałem wątpliwości, czy pole „pmem” (% MEM) na wejściu pslub topwyjściu jest właściwe, aby sprawdzić, czy próbujesz wykryć wyciek pamięci: Czy to nie tylko procent pamięci fizycznej, której aktualnie używa proces? Ale inne części używanej (w tym wycieku) pamięci procesu mogą zostać zamienione. Być może „rozmiar” lub „rozmiar” byłoby bardziej odpowiednie do pomiaru wielkości procesu? Np. ps -A --sort -size -o comm,size | head -n 11Lubps -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zachharyaschev
8

Nic tak naprawdę nie wykorzystuje tej pamięci pod względem aplikacji.

Musisz odjąć wartość „buforowaną”, która reprezentuje pamięć podręczną strony, aby uzyskać lepszy pogląd na faktyczne wykorzystanie pamięci przez program.

Zasadniczo jest to dobre zarządzanie pamięcią i jest to idealne rozwiązanie.

Zobacz link tutaj, aby uzyskać więcej informacji: http://www.linuxatemyram.com/

Matthew Ife
źródło
tak, znalazłem ten link i czytałem o buforach i pamięciach podręcznych, ale o ile mogłem uzyskać z tego, co przeczytałem, nie mogą powodować wymiany, prawda?
jayarjo,
@jayarjo Myślę, że aby zrozumieć, co się tam dzieje, potrzebowalibyśmy statystyk pokazujących problem. Podane liczby nie pokazują zamiany ani dużego zużycia pamięci.
Matthew Ife,
1

Tak naprawdę nie jestem profesjonalistą, ale mydło w płynie + lody są związane z multimediami. Gdy system jest wolny, buforuje i / lub zajmuje pamięć do wykorzystania w przyszłości. A jeśli ruch wzrośnie o określonej porze dnia / w danym okresie, zacznie się zamieniać. W tym momencie, jeśli żądania (użytkownicy przeglądający zawartość) wzrosną, wówczas potrzebne zasoby będą większe niż 8 GB pamięci RAM.

Yash
źródło