Jak sprawdzić użycie pamięci w terminalu Linuksa
- Dave McKay
@TheGurkha
- Marzec 11, 2020, 8:00am EDT
Istnieje wiele sposobów, aby uzyskać niski dół na temat wykorzystania pamięci w systemie Linux. W tym zestawieniu omówimy najczęściej używane metody z linii poleceń: free
vmstat
, oraz top
. Przyjrzymy się również bezpośredniemu odczytywaniu /proc/meminfo
.
Jak Linux wykorzystuje RAM
Pamięć RAM jest ograniczonym zasobem, którego kawałek chcą mieć wszystkie procesy, takie jak aplikacje i demony. Jest jej tylko tyle ile jest dostępne. Jądro rozstrzyga spory o pamięć i przydziela ją wszystkim głodnym procesom. To trochę jak matka ptak z większą ilością otwartych dziobów skierowanych w jej stronę niż ma na to karczocha.
Niewykorzystana pamięć RAM to zmarnowana pamięć RAM. Linux wykorzystuje każdą wolną pamięć RAM do takich rzeczy jak przestrzeń buforowa plików, aby utrzymać komputer w optymalnej wydajności. Łatwo odnieść wrażenie, że pamięć RAM twojego systemu została zużyta przez jakiś uciekający proces lub wyciek pamięci, ale to rzadko ma miejsce.
Zazwyczaj jest to po prostu jądro nieustępliwie wykonujące swoją pracę w tle. Jeśli istnieją inne żądania dla pamięci RAM, którą jądro wykorzystało dla własnych urządzeń, natychmiast zrzeka się pamięci, więc nie dzieje się żadna krzywda.
Jeśli jądro zdecyduje, że bardziej efektywne jest rozpoczęcie korzystania z przestrzeni wymiany, wprowadza to do gry, jak również. Jest wiele zamieszania wokół wartości swappiness
w Linuksie i kiedy jądro zacznie używać swap. Nieprawdą jest, że wartość swappiness
ustawia próg użycia pamięci RAM, który powoduje włączenie swapu.
Ale teraz, spójrzmy na różne techniki, których możesz użyć w oknie terminala, aby zobaczyć użycie pamięci RAM na twoim komputerze z Linuxem.
Komenda free
Komenda free daje ci tabelę całkowitej, używanej, wolnej, współdzielonej, buforowanej/cache, i dostępnej pamięci RAM na twoim komputerze. Pokazuje również całkowitą ilość skonfigurowanej przestrzeni swap, oraz ile jest używane i dostępne.
W naszym przykładzie, użyjemy opcji -m
(mebibytes). Można jednak użyć również opcji -b
(bytes), -k
(kibibytes) lub -g
(gibibibytes).
Wpiszemy następujące polecenie:
free -m
Takie dane wyjściowe otrzymamy:
total used free shared buff/cache available Mem: 1987 901 95 80 990 811 Swap: 1521 651 869
Kolumny Mem
zawierają następujące informacje:
- Razem: Całkowita ilość fizycznej pamięci RAM na tym komputerze.
- Używane: Suma Free+Buffers+Cache odjęta od całkowitej ilości.
- Free: Ilość niewykorzystanej pamięci.
- Shared: Ilość pamięci używanej przez
tmpfs
systemy plików. - Buff/cache: Ilość pamięci używanej dla buforów i pamięci podręcznej. Może ona zostać szybko zwolniona przez jądro w razie potrzeby.
- Available: Jest to szacunkowa ilość pamięci, która jest dostępna do obsługi żądań pamięci od aplikacji i wszelkich innych programów operacyjnych na komputerze.
Kolumny Swap
zawierają następujące informacje:
- Total: Rozmiar partycji lub pliku swap.
- Used: Ilość miejsca swap, które jest w użyciu.
- Wolne: Ilość pozostałego (nieużywanego) miejsca swap.
Możesz również użyć następującej sztuczki, którą podrasowaliśmy od jednego z naszych czytelników, aby zobaczyć procent miejsca swap, które jest używane:
free -m | grep Swap | awk '{print ($3/$2)*100}'
Related: Jak używać darmowej komendy w Linuksie
Komenda vmstat
Nie da się dobrze zrozumieć sposobu w jaki wykorzystywana jest pamięć RAM w Linuksie bez znajomości stanu przestrzeni wymiany. Pamięć RAM i przestrzeń wymiany ściśle ze sobą współpracują.
Możesz użyć polecenia vmstat
aby zanurzyć się głębiej w to jak twoja przestrzeń wymiany (lub pamięć wirtualna) jest używana. Daje ono raport na temat różnych statystyk związanych z wymianą w oparciu o średnie wartości od ostatniego restartu.
Wpisujemy następujące dane:
vmstat
To jest wyjście bez zawijania:
W tym raporcie jest wiele punktów danych, więc podzielimy je na części:
- Proc:
- r: Liczba procesów „możliwych do uruchomienia”. Są one albo uruchomione, albo oczekują na kolejną porcję cykli procesora w określonym czasie.
- b: Liczba procesów w stanie nieprzerwanego uśpienia. Te procesy nie śpią, ale wykonują blokujące wywołanie systemowe. Nie można ich przerwać, dopóki nie zakończą swojego bieżącego działania. Zazwyczaj takim procesem jest sterownik urządzenia czekający na zwolnienie jakiegoś zasobu. Wszelkie przerwania oczekujące w kolejce dla tego procesu są obsługiwane, gdy proces wznawia swoją zwykłą aktywność.
- Pamięć:
- swpd: Ilość używanej pamięci wirtualnej, czyli ile pamięci zostało wymieniane.
- free: Ilość jałowej (nieużywanej) pamięci.
- buff: Ilość pamięci używanej jako bufory.
- cache: Ilość pamięci używanej jako cache.
- Swap:
- si: Ilość pamięci wirtualnej swap w z przestrzeni swap.
- so: Ilość pamięci wirtualnej swap out do przestrzeni swap.
- IO:
- bi: Blocks in. Liczba bloków danych używanych do wymiany pamięci wirtualnej z powrotem do RAM.
- bo: Bloki out. Liczba bloków danych używanych do wymiany pamięci wirtualnej z RAM i do swap space.
- System:
- in: Liczba przerwań na sekundę, wliczając w to zegar.
- cs: Liczba przełączników kontekstu na sekundę. Przełączenie kontekstu jest wtedy, gdy jądro przełącza się z trybu systemowego na tryb użytkownika.
- CPU: Wszystkie te wartości są procentami całkowitego czasu procesora:
- us: Czas spędzony na uruchamianiu kodu użytkownika (nie jądra).
- sy: Czas spędzony na uruchamianiu kodu jądra.
- id: Czas spędzony w stanie bezczynności.
- wa: Czas spędzony na oczekiwaniu na wejście lub wyjście.
- st: Czas, przez który maszyna wirtualna musi czekać, aż hypervisor zakończy obsługę innych maszyn wirtualnych, zanim będzie mógł wrócić i zająć się tą maszyną wirtualną.
PORÓWNANIE: How to Use the vmstat Command on Linux
Komenda top
Komenda top
wyświetla ekran pełen informacji. Wartości są aktualizowane co kilka sekund.
Aby z niego skorzystać, wpisujemy następujące polecenie:
top
Wciśnięty został klawisz „e”. Spowodowało to zmianę wyświetlania na megabajty, które są łatwiejsze do wizualnej analizy niż długie ciągi reprezentujące bajty. Na górze ekranu znajduje się pięć wierszy informacji, a na dole okienko z kolumnami danych.
Oto informacje, które znajdziesz w każdym wierszu:
- Wiersz pierwszy: Czas, jak długo komputer pracuje, ile osób jest zalogowanych i jaka była średnia obciążenia w ciągu ostatniej minuty, pięciu i 15 minut.
- Wiersz drugi: Liczba zadań i ich stany: uruchomione, zatrzymane, śpiące lub zombie.
- Linia trzecia: Informacje o procesorze (patrz podział pól poniżej).
- Linia czwarta: Całkowita ilość pamięci fizycznej, oraz ile jest wolnej, używanej, buforowanej lub buforującej.
- Linia piąta: Całkowita ilość pamięci swap, oraz ile jest wolnej, używanej i dostępnej (biorąc pod uwagę pamięć, która ma być odzyskiwana z pamięci podręcznej).
Pola CPU w linii trzeciej są następujące:
- us: Czas, który procesor spędza na wykonywaniu procesów dla użytkowników w przestrzeni użytkownika.
- sy: Czas, jaki procesor spędził na uruchamianiu procesów systemowych w przestrzeni jądra.
- ni: Czas, który procesor spędził na wykonywaniu procesów z ręcznie ustawioną wartością nice.
- id: Czas bezczynności procesora.
- wa: Czas spędzony przez CPU na oczekiwaniu na zakończenie operacji wejścia/wyjścia.
- hi: Czas spędzony przez CPU na obsłudze przerwań sprzętowych.
- si: Czas, jaki procesor spędził na obsłudze przerwań programowych.
- st (steal time): Czas, który procesor stracił z powodu uruchomienia maszyn wirtualnych.
Może się zdarzyć, że będziesz musiał nacisnąć klawisz strzałki w lewo lub w prawo, aby zobaczyć wszystkie kolumny. Wartości w każdej kolumnie są opisane poniżej:
- PID: ID procesu.
- USER: Nazwa właściciela procesu.
- PR: Priorytet procesu.
- NI: Wartość nice procesu.
- VIRT: Pamięć wirtualna używana przez proces.
- RES: Pamięć rezydentna używana przez proces.
- SHR: Pamięć współdzielona używana przez proces.
- S: Status procesu. (Zobacz listę wartości, jakie może przyjmować to pole poniżej).
- %CPU: Udział czasu procesora wykorzystywany przez proces od ostatniej aktualizacji.
- %MEM: Udział wykorzystywanej pamięci fizycznej.
- TIME+: Całkowity czas procesora wykorzystywany przez zadanie w setnych częściach sekundy.
- COMMAND: Nazwa polecenia lub wiersz (nazwa + opcje). (Ta kolumna znajduje się poza ekranem po prawej stronie na powyższym obrazku.)
Stan wyświetlany w kolumnie S
może być jednym z następujących:
- D: Uninterruptible sleep.
- R: Running.
- S: Sleeping.
- T: Traced (zatrzymany).
- Z: Zombie.
Naciśnij Q, aby wyjść top
.
Odczytywanie /proc/meminfo
Wiele (i, prawdopodobnie, większość) narzędzi w Linuksie, które raportują statystyki pamięci, pobierają swoje informacje z pseudo systemu plików /proc/meminfo
. Możemy użyć komend cat
lub less
, aby zrobić to samo.
Wpisujemy następujące polecenie:
less /proc/meminfo
Możesz zobaczyć różne pola w zależności od uruchomionego jądra i architektury procesora. Na naszej maszynie wirtualnej otrzymaliśmy następujące wyniki:
MemTotal: 2035260 kB MemFree: 919064 kB MemAvailable: 1300932 kB Buffers: 33528 kB Cached: 457604 kB SwapCached: 29732 kB Active: 313360 kB Inactive: 603276 kB Active(anon): 74648 kB Inactive(anon): 355004 kB Active(file): 238712 kB Inactive(file): 248272 kB Unevictable: 16 kB Mlocked: 16 kB SwapTotal: 1557568 kB SwapFree: 873024 kB Dirty: 80 kB Writeback: 0 kB AnonPages: 414100 kB Mapped: 97436 kB Shmem: 4148 kB KReclaimable: 52932 kB Slab: 94216 kB SReclaimable: 52932 kB SUnreclaim: 41284 kB KernelStack: 9280 kB PageTables: 45264 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2575196 kB Committed_AS: 5072192 kB VmallocTotal: 34359738367 kB VmallocUsed: 35712 kB VmallocChunk: 0 kB Percpu: 720 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 180160 kB DirectMap2M: 1916928 kB
Wszystkie rozmiary podane są w kibibajtach, chyba że zaznaczono inaczej. Oto, co one oznaczają, wraz z kilkoma innymi, które możesz zobaczyć w zależności od konfiguracji komputera i sprzętu:
- MemTotal: Całkowita ilość możliwej do wykorzystania pamięci RAM (poza kilkoma zarezerwowanymi bitami i kodem binarnym jądra).
- MemFree: Suma
LowFree
HighFree
. Ilość aktualnie dostępnej pamięci RAM. - MemAvailable: Szacunkowa ilość pamięci dostępna do uruchomienia nowych aplikacji, bez swapowania.
- Bufory: Tymczasowy magazyn dla surowych bloków dyskowych. Zmniejsza to obciążenie i wydajność dysku twardego. Przyspiesza również dostęp do kolejnych żądań tych samych danych, ponieważ są one już w pamięci.
- Bufory: Buforowane strony odczytywane z plików na dysku twardym (nie włączając
SwapCached
). - SwapCached: Pamięć, która była wymieniana na zewnątrz i z powrotem, a jej kopia pozostaje w przestrzeni wymiany.
- Aktywna: Pamięć używana ostatnio. Nie jest odzyskiwana, chyba że jest to absolutnie konieczne.
- Inactive: Pamięć, która była używana, ale nie jako ostatnio używana. Jest prawdopodobnym kandydatem do odzyskania.
- Active(anon): Pamięć przydzielona do plików utworzonych w systemie
tmpfs
pseudo-plików. Pliki anonimowe nie rezydują na dysku twardym. - Inactive(anon): Ilość anonimowej,
tmpfs
, ishmem
pamięci, która jest kandydatem do eksmisji (odzyskiwania pamięci). - Active(file): Ilość pamięci cache pliku w użyciu, lub która została użyta od poprzedniego cyklu rekultywacji pamięci.
- Inactive(plik): Ilość pamięci cache plików odczytanej z dysku twardego, która jest kandydatem do odzyskania.
- Nieaktywna(plik): Ilość pamięci, która powinna być eksmitowalna, ale nie jest, ponieważ jest zablokowana w pamięci przez procesy w przestrzeni użytkownika.
- Mlocked: Całkowita ilość pamięci, która nie jest eksmitowalna, ponieważ jest zablokowana przez procesy przestrzeni użytkownika.
- HighTotal: Całkowita ilość HighMem, która jest używana przez programy przestrzeni użytkownika i pamięć podręczną stron. Jądro może uzyskać dostęp do tej strefy pamięci, ale jest to wolniejsze niż LowMem.
- HighFree: Ilość wolnej pamięci HighMem.
- LowTotal: Ilość pamięci LowMem, która jest dostępna dla wszystkich tych samych zastosowań co HighMem, ale także dla jądra do wykorzystania do własnych celów.
- LowFree: Ilość wolnej pamięci LowMem.
- MmapCopy: Ilość pamięci, która została zmapowana na dane pliku.
- SwapTotal: Całkowita ilość dostępnej przestrzeni wymiany.
- SwapFree: Ilość przestrzeni wymiany, która jest obecnie niewykorzystana.
- Dirty: Ilość pamięci oczekującej na zapis na dysk.
- Writeback: Pamięć aktywnie zapisywana z powrotem na dysk.
- AnonPages: Strony niebędące plikami zmapowane do tablic stron przestrzeni użytkownika.
- Mapped: Pliki (jak biblioteki), które są mapowane do pamięci.
- Shmem: Ilość pamięci zużytej w
tmpfs
systemach pseudoplikowych. - KReclaimable: Alokacje pamięci jądra, które jądro będzie próbowało odzyskać, jeśli zapotrzebowanie na pamięć jest wystarczająco duże.
- Slab: Pamięć podręczna struktur danych w jądrze.
- SReclaimable: Ilość
Slab
pamięci, która może być odzyskana, np. cache. - SUnreclaim: Ilość
Slab
pamięci, która nie może być odzyskana. - KernelStack: Ilość pamięci przydzielonej do stosów jądra.
- PageTables: Ilość pamięci przeznaczonej na najniższy poziom tablic stron.
- Quicklists: Ponieważ alokacja i usuwanie tablic stron jest bardzo częstą operacją, ważne jest, aby była ona jak najszybsza. Dlatego strony używane w tabelach stron są buforowane na wielu różnych listach zwanych „quicklists.”
- NFS_Unstable: Strony Network File System (NFS), które serwer otrzymał, ale nie zapisał jeszcze w pamięci nieulotnej.
- Bounce: Pamięć używana dla buforów odbijających urządzenia blokowego. Bufor odbijający jest umieszczony w pamięci na tyle nisko, że urządzenie może uzyskać do niego bezpośredni dostęp. Dane są następnie kopiowane do pożądanej strony użytkownika w HighMem.
- WritebackTmp: Pamięć używana przez Filesystem in Userspace (FUSE) dla tymczasowych buforów write-back.
- CommitLimit: Całkowita ilość pamięci aktualnie dostępna do zaalokowania w systemie.
- Committed_AS: Ilość pamięci szacowana na zaspokojenie wszystkich bieżących zapotrzebowań. Jeśli program zażąda trochę pamięci RAM, żądanie jest rejestrowane, ale pamięć RAM jest alokowana dopiero wtedy, gdy program zacznie jej używać. Jest ona również przydzielana tylko w miarę potrzeb, aż do maksymalnej ilości, którą program zarezerwował. Więcej pamięci może być „przydzielone” niż może być faktycznie dostarczone. Jeśli wszystkie programy spróbują spieniężyć swoje żetony RAM na raz, kasyno pamięci może splajtować (i będzie musiało iść z czapką w ręku do finansistów przestrzeni wymiany).
- VmallocTotal: Całkowity rozmiar obszaru pamięci vmalloc.
- VmallocUsed: Ilość wykorzystanego obszaru vmalloc. Od Linux 4.4, to pole nie jest już obliczane, jest zakodowane na sztywno.
- VmallocChunk: Największy ciągły blok wolnego obszaru vmalloc.
- HardwareCorrupted: Ilość pamięci oznaczona jako mająca problemy z uszkodzeniem pamięci fizycznej. Nie zostanie ona przydzielona.
- LazyFree: Ilość pamięci w
MADV_FREE
stanie. Kiedy aplikacja ustawia flagęMADV_FREE
na szeregu stron, oznacza to, że już ich nie potrzebuje, i są one teraz kandydatami do reklasyfikacji. Faktyczne przetasowanie może być opóźnione do czasu aż pojawi się wystarczające zapotrzebowanie na pamięć. Jeśli aplikacja zacznie zapisywać na stronach, reklame można anulować. - AnonHugePages: Ogromne strony bez kopii zapasowych plików zmapowane do tablic stron przestrzeni użytkownika. Strony te nie pochodzą z pliku na dysku twardym.
- ShmemHugePages: Ilość pamięci używanej przez pamięć współdzieloną (
shmem
) i systemy pseudoplikowe (tmpfs
) alokowane z ogromnymi stronami. - ShmemPmdMapped: Ilość pamięci współdzielonej mapowanej do przestrzeni użytkownika za pomocą ogromnych stron.
- CmaTotal: Ilość stron CMA (Contiguous Memory Allocator). Są one używane przez urządzenia, które mogą komunikować się tylko do sąsiadujących regionów pamięci.
- CmaFree: Ilość wolnych stron CMA (Contiguous Memory Allocator).
- HugePages_Total: Rozmiar puli ogromnych stron.
- HugePages_Free: Ilość nieprzydzielonych ogromnych stron w puli.
- HugePages_Rsvd: Liczba zarezerwowanych ogromnych stron. Zobowiązanie do alokacji zostało podjęte, ale alokacja jeszcze nie nastąpiła.
- HugePages_Surp: Liczba ogromnych stron w puli powyżej zdefiniowanej wartości systemowej.
- Hugepagesize: Rozmiar ogromnych stron.
- DirectMap4k: Liczba bajtów pamięci RAM zmapowanych na strony o wielkości 4 kB.
- DirectMap4M: Liczba bajtów pamięci RAM zmapowanych na strony o wielkości 4 MB.
- DirectMap2M: Liczba bajtów pamięci RAM zmapowanych na strony o wielkości 2 MB.
- DirectMap1G: Liczba bajtów pamięci RAM mapowanych na strony o rozmiarze 2 GB.
Jak zwykle w przypadku Linuksa, istnieje więcej niż jeden sposób, aby uzyskać szybki przegląd, i zawsze przynajmniej jeden sposób, aby zagłębić się w szczegóły.
Prawdopodobnie będziesz używał free
top
, i vmstate
regularnie, i trzymaj /proc/meminfo
w rezerwie na wypadek, gdybyś musiał wykonać głębokie nurkowanie, aby zbadać konkretny problem.
Dave McKay po raz pierwszy używał komputerów, gdy modna była taśma papierowa z dziurkowanym nadrukiem, i od tego czasu zajmuje się programowaniem. Po ponad 30 latach pracy w branży IT, obecnie jest pełnoetatowym dziennikarzem technologicznym. W swojej karierze pracował jako niezależny programista, kierownik międzynarodowego zespołu programistów, kierownik projektu usług informatycznych, a ostatnio jako inspektor ochrony danych. Dave jest ewangelistą Linuksa i zwolennikiem open source.Read Full Bio”