Jak obliczyć wolną pamięć RAM w Linuksie?

Ile mam wolnej pamięci w systemie? to częste pytanie i użytkowników desktopów, i administratorów. Na każde pytanie istnieje prosta, błędna odpowiedź i podobnie jest w tym przypadku, choć ustalanie ilości wolnej pamięci RAM wydaje się trywialną sprawą. Większość ludzi korzysta z polecenia free, którego przykładowy wynik może wyglądać następująco (desktop):

total       used       free     shared    buffers     cached
Mem:       3926996    3614388     312608          0      82656    1305692
-/+ buffers/cache:    2226040    1700956
Swap:      1022964      20480    1002484

Typowa interpretacja byłaby zapewne w tym przypadku taka, że wolnych jest 312608 kB RAM. Niezupełnie jest to prawdą. Tzn. tyle pamięci faktycznie jest zupełnie nieużywanej, ale tak naprawdę w razie potrzeby dla aplikacji dostępne jest znacznie więcej pamięci i należałoby raczej patrzeć na drugi wiersz, nie pierwszy, czyli bliższym prawdy wynikiem jest, że wolnych w tym przypadku jest 1700956 kB RAM.

W przypadku serwerów z Linuksem, ilość wolnej pamięci łatwiej odczytać, szczególnie na potrzeby skryptów, z /proc/meminfo/:

cat /proc/meminfo | head -n 5
MemTotal:        3926996 kB
MemFree:          296944 kB
MemAvailable:    1589592 kB
Buffers:           82692 kB
Cached:          1305316 kB

Patrząc na wartości z /proc/meminfo, ilość zajętej i wolnej pamięci RAM można liczyć w następujący sposób:

Free RAM = MemFree + Buffers + Cached
Used RAM = MemTotal - (MemFree + Buffers + Cached)

Jednak i to niezupełnie jest prawdą, bo do w skład Cached wchodzą np. obszary używane przez tmpfs, które nie mogą być zwolnione. Dlatego niedawno w /proc/meminfo dodano kolejną wartość MemAvailable, której zadaniem jest podawanie wprost ilości dostępnej do wykorzystania przez programy (czyli, potocznie, wolnej) pamięci. Jeśli taka wartość jest podana, to zamiast powyższych wzorów lepiej skorzystać z:

Free RAM = MemAvailable
Used Ram = MemTotal - MemAvailable

Linki:

  1. http://www.linuxatemyram.com/
  2. https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

8 odpowiedzi na “Jak obliczyć wolną pamięć RAM w Linuksie?”

  1. Dla mnie MemFree to pamięć zmarnowana. Linux stara się jak najlepiej wykorzystać całą dostępną przestrzeń i czasami faktycznie trudno jest komuś wytłumaczyć, że coś takiego:
    [kbechler@srv1 ~]$ free -m
    total used free shared buffers cached
    Mem: 15987 15368 619 0 302 13788
    -/+ buffers/cache: 1277 14709
    Swap: 8191 860 7331
    to system, który ma bardzo dużo wolnej pamięci i nie należy się martwić 🙂

    Jeszcze weselej jest w polskiej wersji Windows Server 2008R2. Trudno jest samemu wykombinować, że pamięć 'wstrzymana’, to radosna twórczość tłumacza i w oryginalne jest to 'standby’, czyli (cytując za Microsoftem) „Memory that contains cached data and code that is not actively in use”.

    K.

  2. A to wszystko po to, żeby laik się przestraszył i pobiegł dokupić RAMu!
    Żartuję ;o)
    Nie chce mi się obliczać ale gdy jest aktywny Swap to co pokazuje MemAvailable – sam wolny RAM jako RAM, czy razem z dyskowym Swapem? Bo coś mi się zdaje, że to drugie.

  3. @konrad Zgadza się, MemFree to pamięć zmarnowana. Albo, inaczej, niewykorzystany zapas. 😉

    @Monter: Bez swap liczy. Z drugiego linka: MemAvailable: An estimate of how much memory is available for starting new applications, without swapping.

  4. Interaktywnie? Pewnie prościej. O ile htop jest zainstalowany, co w przypadku różnych dziwnych maszyn (embedded) nie musi być prawdą… Natomiast do monitoringu to ja jednak wolę metody z wpisu.

    Nawiasem, z której metody korzysta htop?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *