Dlaczego Linux dziwnie raportuje „wolną” pamięć?


44

To kanoniczne pytanie o to, jak systemy operacyjne Unix zgłaszają użycie pamięci.
Podobne pytania:

Mam serwer produkcyjny, na którym działa Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Każdego dnia cron wykonuje skrypt kopii zapasowej jako root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Wszystko działa idealnie, ale zauważam, że wykres pamięci Munina pokazuje wzrost pamięci podręcznej i buforów po utworzeniu kopii zapasowej.

Następnie pobieram pliki kopii zapasowej i usuwam je. Po usunięciu wykres pamięci Munina zwraca pamięć podręczną i bufory do stanu sprzed tworzenia kopii zapasowej.

Oto wykres Munin:

Obraz hostowany na zewnątrz był martwym linkiem.


3
Gratulacje, to pytanie zostało kanonizowane (to jak szóste pytanie, które dziś o to pyta, i zdarza się, że ma najciekawszy i najładniejszy przykład :-)
voretaq7

Odpowiedzi:


27

Jest to ten sam „problem”, co w przypadku serwera, który odmawia użycia partycji wymiany i kilku innych podobnych pytań na tej stronie. ( Wysokie zużycie pamięci w systemie Linux Server , zużycie pamięci w systemie LINUX , serwer WWW ma mało pamięci itp.)

Zwróć uwagę na fakt, że zużycie pamięci pochodzi z pamięci podręcznej . Oznacza to, że przechowuje plik w pamięci. Pamięć buforowana to pamięć „wolna”. Zamiast pozostawiać blok pamięci pusty, system operacyjny utrzymuje ostatnio odczytywane pliki w tym miejscu. Jeśli aplikacja potrzebuje tej pamięci, zostanie z niej wykorzystana. Do tego czasu ma szansę uratować użytkownika przed ponownym odczytaniem pliku z dysku, jeśli często się do niego odwołuje.

Zgodnie z tym wykresem efektywne zużycie pamięci w ogóle się nie zmieniło przez cały czas trwania wykresu.


Czy można poinstruować serwer, aby nie buforował tych plików? Chyba powinienem uruchomić sync; echo 3 > /proc/sys/vm/drop_cachespo utworzeniu kopii zapasowej?

13
@ stan31337 Tak, jest to możliwe, nie, nie powinieneś tego robić. Posiadanie tego pliku w pamięci nic Cię nie kosztuje. Jeśli wyczyścisz wszystkie pamięci podręczne, każdy plik, który jest buforowany i musi zostać ponownie odczytany z dysku, po prostu spowolni twój system. Niech robi to, co zostało zaprojektowane.
Jeff Ferland

2
@ stan31337 Po usunięciu pliku kopii zapasowej system operacyjny automatycznie wykopuje go z pamięci podręcznej (dlatego wolna pamięć ponownie skacze po usunięciu) - Linux jest wystarczająco inteligentny, aby wiedzieć, że plik nie jest otwarty i nie może zostanie osiągnięty z drzewa systemu plików, nigdy więcej nie będzie dostępny. Jak powiedział Jeff, zdecydowanie nie chcesz zrzucać całej pamięci podręcznej FS (system będzie musiał tylko ponownie odczytać i ponownie buforować te dane z dysku, co faktycznie spowolni twój serwer)
voretaq7

61

Występuje problem z linią Ate My Ram w systemie Linux .

Nie panikuj.

To nie jest problem.

Twój system działa zgodnie z przeznaczeniem.

Problemem nie jest twój system operacyjny - problemem jest twoje zrozumienie, czym jest „wolna” pamięć.


Systemy uniksowe używają pamięci nie tylko do uruchamiania programów. Pamięć może być używana do:

  • Uruchamianie programów (aktywne / używane)
  • Buforowanie przesyłanych danych (bufory)
  • Buforowanie danych ostatnio odczytanych / zapisanych na dysk (pamięć podręczna)
  • Absolutnie nic (za darmo)

Poniżej znajduje się krótka (iw dużej mierze niekompletna) prezentacja tego, jak nowoczesne systemy uniksowe zgłaszają użycie pamięci RAM.

Co to jest wolna pamięć (definicja systemu operacyjnego) ?

Gdy system uniksowy zgłasza pamięć RAM jako wolną , oznacza to: „Nie używam tej pamięci RAM do niczego”.
Wolna pamięć RAM jest faktycznie bezwartościowa - nie przyspiesza twojego systemu, po prostu siedzi „wolna” na wypadek, gdyby coś jej potrzebowało. Tym czymś może być dowolny z trzech innych elementów, o których wspomniałem powyżej.

Co to jest pamięć podręczna i buforowa?

Pamięć podręczna i pamięć buforowa to pamięć RAM używana przez system operacyjny w celu przyspieszenia działania systemu.
Ta pamięć nie jest teraz potrzebna do uruchamiania programów , więc Twój system operacyjny używa jej do przechowywania często potrzebnych danych - na przykład biblioteka C (potrzebna prawie przez każdy uruchamiany program) jest prawie zawsze przechowywana w cachepamięci, więc system nie musi iść na dysk, aby znaleźć instrukcje potrzebne do wydrukowania „Hello World” na ekranie.
Jest to o wiele bardziej skomplikowane - pamięć współdzielona, pamięć przewodowa itp. - ale dla naszych celów to proste wyjaśnienie jest wystarczające.

Co to jest pamięć aktywna?

Pamięć aktywna jest częścią tego, co rozumiemy jako pamięć „używaną” - pamięć RAM, której aplikacje używają do wszystkiego, co robią - sortowanie arkuszy kalkulacyjnych, serwowanie stron internetowych, edytowanie grafiki itp.
Pamięć „Aktywna” była ostatnio „aktywna” - - program, który twierdzi, że wykorzystał jego zawartość (czytanie lub pisanie) i nie jest uważany za dobrego kandydata do zamiany.

Co to jest pamięć nieaktywna?

Podobnie jak pamięć aktywna, pamięć nieaktywna to pamięć RAM, której aplikacje używają do wszystkiego, co robią. Różnica polega na tym, że pamięć ta nie była dostępna od dłuższego czasu, więc jeśli push przychodzi, aby odepchnąć system operacyjny uważa, że ​​można go zamienić na dysk i (przy odrobinie szczęścia) program twierdzi, że nie poprosi o to ponownie, więc nigdy tego nie zauważy.

Co to jest pamięć „używana” (definicja CZŁOWIEKA)

To, co ty i ja uważamy za pamięć „używaną”, jest zasadniczo sumą pamięci aktywnej i nieaktywnej. Cała pamięć RAM aktualnie żądana przez aplikacje do ich użycia.
Tak długo, jak masz zainstalowaną więcej pamięci RAM niż suma pamięci aktywnej i nieaktywnej (plus ładny margines bezpieczeństwa, powiedzmy 512-1024 MB na górze), jesteś w dobrym miejscu: Twój system operacyjny prawdopodobnie nie osiągnie wydajności wymiany i zabijania .

Co to jest „wolna” pamięć (definicja CZŁOWIEKA) ?

To, co ty i ja uważamy za „wolną” pamięć, to pamięć dostępna do uruchamiania programów.
Jest to nieco bardziej skomplikowane niż tylko „bezpłatna” liczba raportów systemu operacyjnego. Gdy program prosi o pamięć RAM, system operacyjny spróbuje uzyskać tę pamięć RAM w jak najmniej zakłócający sposób:

  • Jeśli dostępna jest Wolna pamięć (siedząca bezczynnie), pamięć RAM zostanie przydzielona.
  • Jeśli nie ma dostępnej wolnej pamięci, system operacyjny kanibalizuje pamięć podręczną i przestrzeń buforową: Rzadziej / ostatnio najrzadziej dostępne elementy w puli buforów zostaną wyrzucone, a pamięć RAM przekazana programowi.
  • Jeśli nie ma bufora / pamięci podręcznej RAM do kanibalizacji, swapper spojrzy na nieaktywną pamięć i wybierze regiony, które według niego są najmniej prawdopodobne. Dane zostaną przeniesione na stronę wymiany (dysk), a nowo zwolniona pamięć RAM zostanie przekazana programowi.
  • Jeśli cała nieaktywna pamięć RAM została zamieniona, swapper rozpocznie umieszczanie aktywnej pamięci RAM na dysku.
    (Chodzi tutaj o to, gdzie wydajność zwykle idzie do psów: za każdym razem, gdy program włącza procesor, jego zamienione bity muszą zostać przywrócone do pamięci RAM, co oznacza , że pamięć aktywna innego programu musi zostać zamieniona - wysoki obrót w swapie nazywa się thrashingiem )
  • Jeżeli system wyswapowany wszystko to może (i wypełnione partycji wymiany) lub jeśli używasz systemu bez partycji wymiany, Bad Things zdarzyć. W tym momencie nastąpi jedna z dwóch rzeczy:
    • malloc()zawiedzie. Jest to zachowanie zgodne z POSIX - system operacyjny poinformuje program z prośbą o pamięć RAM, że nie może spełnić żądania.
      Program może poprosić o mniej pamięci RAM lub, jeśli nie poradzi sobie z mniejszą ilością pamięci, może wyczyścić i wyjść. (Jeśli program jest źle napisany, po prostu się zawiesi.)
    • Jeśli korzystasz z Linuksa, OOM-Killer może iść na przejażdżkę w stylu gangów, zabijając szaleństwo, przerywając inne procesy, aby spróbować zwolnić wystarczającą ilość pamięci RAM, aby spełnić żądanie.
      W przypadku, gdy nie możesz powiedzieć na podstawie mojego opisu tutaj i mojej odpowiedzi na powiązane pytanie, uważam, że jest to okropny sposób na rozwiązanie problemu.

Dlaczego wolna pamięć RAM rośnie po usunięciu plików?

W przykładzie z pytania tutaj zauważyłeś, że można „zwolnić” pamięć RAM, usuwając plik kopii zapasowej - wyjaśnienie tego jest dość proste: ponieważ nic nie używa tego pliku (brak otwartych uchwytów plików) i nie jest już dostępny z system plików (niepowiązany) system operacyjny wie, że nikt nigdy nie uzyska dostępu do tych danych, i usuwa dane z pamięci podręcznej systemu plików.
To sprawia, że ​​system operacyjny zgłasza więcej wolnej pamięci, ale nie ma wpływu na wydajność systemu.


Teraz jest dla mnie całkowicie jasne ... Moje doświadczenie z Linuksem trwa około 2 miesięcy, wszystko zaczęło się od tego serwera Debian. Miesiąc temu zainstalowałem Gentoo na moim laptopie domowym i byłem tak zaskoczony jego wydajnością, że całkowicie zmienił się użytkownik Windows na Linux nawet na moim komputerze. Wspaniale jest uczyć się Linuksa w Gentoo, a do nauki jest jeszcze bardzo dużo.

@ stan31337 Nie jesteś jedynym, dla którego jest niejasne - jest to szczególnie trudne dla osób pochodzących z systemu Windows, ponieważ jeśli nie zagłębisz się w to, Windows nie zgłasza zużycia pamięci z tym poziomem szczegółowości - jest po prostu „Używany” (według programów ) i „Darmowy” (dla programów do wzięcia). Użytkownicy komputerów Mac mają to trochę łatwiej, ponieważ Monitor aktywności jest w zasadzie graficzną wersją topi zgłasza wolną / przewodową / aktywną / nieaktywną pamięć RAM.
voretaq7,

Kiedyś pracowałem z Process Explorerem w systemie Windows, miał wiele rzeczy do pokazania w pamięci, ale większość z nich była dla mnie tak niejasna, że ​​tak naprawdę nie

2
Należy również zauważyć, że chociaż system Windows zwykle nie pokazuje tego zbyt szczegółowo, ma bardzo podobną konfigurację.
Joachim Sauer

Wiesz, nawet w Windows odczyt pamięci jest mylący. Jest to coś, na co twórcy systemów operacyjnych mogą chcieć położyć większy nacisk, a raczej coś, na czym użytkownicy powinni się mniej przejmować niż obecnie.
gparent

2

Coś jeszcze, aby sprawdzić, czy powyższe nie powiedzie się:

Sprawdź wykorzystanie pamięci podręcznej (Slab Slab:, SReclaimable:a SUnreclaim:w /proc/meminfo). Jest to pamięć podręczna wewnętrznych struktur danych i jest niezależna od pamięci podręcznej stron zgłaszanej przez free.

Jeśli pamięć podręczna płyty jest odpowiedzialna za dużą część „brakującej pamięci”, sprawdź, /proc/slabinfogdzie się ona skończyła. Jeśli to dentraty lub i-węzły, możesz sync ; echo 2 > /proc/sys/vm/drop_cachessię ich pozbyć.

Możesz także użyć tego slabtopnarzędzia, aby pokazać bieżące użycie pamięci podręcznej Slab w przyjaznym formacie. cposortuje listę według bieżącego rozmiaru pamięci podręcznej.

Od: https://stackoverflow.com/a/5467207

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.