Odczytywanie stanu pamięci w systemie
Napisał: Patryk Krawaczyński
21/07/2016 w Administracja 1 komentarz. (artykuł nr 534, ilość słów: 629)
W
większości przypadków systemy Linuksowe dobrze radzą sobie z obsługą pamięci. Istnieje zawsze ryzyko, że niektóre programy wymkną się spod kontroli i przydzielą sobie więcej pamięci niż jest normalnie możliwe i wejdą w strefę pliku wymiany. W takich sytuacjach można zaobserwować znaczne spowolnienie systemu (chyba, że używamy dysków SSD dla swap), a sprawdzenie dostępnej pamięci będzie prawdopodobnie pierwszą rzeczą jakiej należy się przyjrzeć.
Najszybszą i najbardziej zrozumiałym poleceniem do tego celu jest free
. Wynik komendy możemy uczynić bardziej czytelnym przez dodanie parametru -m
, który zwróci wartości w megabajtach:
agresor@darkstar:~$ free -m total used free shared buffers cached Mem: 1983 1061 921 48 15 232 -/+ buffers/cache: 813 1170 Swap: 1022 0 1022
Mamy przed sobą trzy wiersze (oprócz legendy) oraz sześć kolumn informacji. Pierwszy wiersz (Mem:
) pokazuje nasze aktualne zużycie pamięci RAM. W kolumnie total
zdefiniowane jest 2GB RAMu (nie jest to pełna wartość, ponieważ część z tej pamięci jest zarezerwowana dla jądra oraz obsługę sprzętu). Kolejna kolumna – used
przedstawia ile pamięci zostało pochłoniętej przez aktualnie działający system, czyli free
to niezagospodarowana jej część. Z powyższego przykładu wynika, że mamy tylko 921 MB, co nie jest do końca prawdą. Jak poprawnie zinterpretować powyższe informacje? Po pierwsze used
w pierwszym wierszu pokazuje ile pamięci jest używane wliczając w to obiekty, które zostały wrzucone do pamięci podręcznej (kolumna: cache
) dysku. Pamięć ta niekoniecznie jest używana przez procesy chodzące w systemie, ale napewno wykorzystywana przez nie do szybszego odczytu danych się w niej znajdujących, a tym samym nie obciążania dysku i przyśpieszania działania systemu. Jeśli zostanie uruchomiony proces, który wymaga więcej pamięci RAM niż przewiduje to wartość free
z pierwszego wiersza- jądro Linuksa odda część pamięci podręcznej dysku.
Kiedy system czyta pierwszy raz coś z dysku – wrzuca to do pamięci podręcznej, aby kolejne odczyty odbywały się z cache zamiast za każdym razem z dysku, ponieważ pamięć RAM jest szybsza w dostępie. Oczywiście informacje te starzeją się lub deaktualizują z czasem. Wraz z zapełnianiem całego miejsca pamięci następuje ewikcja najstarszych obiektów, aby zrobić miejsce dla nowych. Możemy zresztą sami zwolnić tą pamięć z systemu. Czyli, jeśli chcemy określić ile wolnej pamięci występuje w systemie powinniśmy zawsze patrzeć na wartość z drugim wierszu i drugiej kolumnie (1170 MB). Powodem do zmartwień może być sytuacja, w której wartość ta spadnie do na tyle małych wartości, że system zacznie wykorzystywać partycję lub plik wymiany (trzeci wiersz, druga kolumna).
Obok wartości cache
istnieje jeszcze słowo buffers
– odnosi się ono do danych przechowywanych w buforach systemu, a jeszcze nie zapisanych na dysku. Linux robi to w systematycznych interwałach czasowych, w których uruchamiany jest sync. Możemy nawet sami wydać to polecenie, aby np. mieć pewność, że dane zostały zapisane do bazy danych zanim ją wyłączymy, czy wyjmiemy dysk wymienny po zapisaniu na nim porcji danych. Jak wyświetlić posortowane malejąco procesy w systemie, które zajmują najwięcej pamięci?
ps axo %mem,pid,euser,cmd | sort -nr | head -n 10 htop -s MEM top -s %MEM
Więcej informacji: Meaning of the buffers/cache line in the output of free, man free
Na początku 2014 roku programiści jądra zlitowali się nad użytkownikami tworząc dla nich kolumnę:
available
. Kod wprowadzający tą zmianę zawiera szczegółowy opis nowej kolumny. Podaje ona wprost przewidywalną wartość dostępnej pamięci dla nowych aplikacji w systemie.