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:
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.
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.
@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.
Dzięki za poradę i w sumie fajnie, że podajesz linki (jak rozumiem źródła), bo wiele osób tego nie robi.
A nie prościej będzie htop’em ?
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?
gościu błąd jest bo nie „/proc/memifno/” tylko „/proc/meminfo” pozdro
Faktycznie, litrówka w jednym miejscu. Poprawiam, dzięki.