NFsec Logo

Odczytywanie stanu pamięci w systemie

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

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , ,

1 komentarz.

  1. 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.