Jak zgłaszane jest użycie pamięci w systemie Linux?


17

Używając ps, widzę rozmiar, rozmiar (taki sam jak top VIRT?) I rss (taki sam jak RES górny?). (Jeszcze jeden widzę u góry to SHR.)

Czy ktoś mógłby streścić dla mnie, co oznaczają te różne pola?


Wolę zobaczyć fajne podsumowanie na tej stronie niż link, który może zniknąć, aby ta strona mogła funkcjonować jako odniesienie.
Jim Hunziker,

Odpowiedzi:


34

W skrócie:

  • Rozmiar wirtualny: jest to przestrzeń adresowa zarządzana przez proces. Wirtualna przestrzeń adresowa zawiera wszystko, do czego proces może uzyskać dostęp za pośrednictwem wskaźników (odwołania do adresów pamięci). Na przykład, jeśli Twój program uzyska dostęp do bufora ramki karty graficznej, pamięć ta jest mapowana na przestrzeń wirtualną procesu i otrzymuje adres, który jest przechowywany we wskaźniku. Pliki mapowane w pamięci i anonimowe mapowania są również uwzględniane w rozmiarze wirtualnej przestrzeni adresowej. Prawie wszystko ma rozmiar wirtualny. Jeśli zsumujesz rozmiar wszystkich zakresów adresów wymienionych w /proc/<pid>/maps, powinien on zwrócić mniej więcej tę samą wartość rozmiaru wirtualnego.

  • Rozmiar rezydenta: to ilość pamięci, która należy do tego procesu, który jest obecnie rezydentem w pamięci. Oznacza to ilość pamięci, która nie jest zamieniana. Należy pamiętać, że części procesu mogą znajdować się w pamięci wymiany, nawet gdy proces jest uruchomiony. System operacyjny usunie te regiony z wymiany, gdy proces spróbuje uzyskać do nich dostęp. Powinno to obejmować stos, stosy wszystkich wątków i inne prywatne mapowania. Jeśli zajrzysz do /proc/<pid>/mapsśrodka [stack], [heap]i inne anonimowe mapowania (te bez ścieżek plików) zostaną zamienione lub uwzględnione w rozmiarze rezydenta.

  • Rozmiar współdzielony: to ilość pamięci, która może należeć do wielu procesów. Na przykład, jeśli masz cztery instancje tej samej aplikacji załadowane do pamięci, będziesz miał cztery instancje sterty i co najmniej cztery stosy, po jednym dla każdego procesu (jest to pamięć rezydentna), ale będziesz mieć tylko jedną instancję kod binarny programu i jego bibliotek. To jest wspólna przestrzeń. Zawiera nie tylko kod binarny programu i jego biblioteki, ale także pliki lokalizacji, dane programu tylko do odczytu, segmenty pamięci wspólnej SysV i POSIX, semafory itp. Jeśli spojrzysz /proc/<pid>/maps, większość mapowań związanych z biblioteką i plikami programów jest udostępnione.

Pamiętaj, że VIRT zawiera połączenie kanałów RSS i SHR i zawsze będzie większe niż którekolwiek z nich. Regiony mogą być traktowane zarówno jako RSS, jak i SHR.


2
Nawiasem mówiąc, w najnowszych wersjach systemu Linux można zobaczyć bardzo szczegółowy podział wykorzystania pamięci w / proc / <pid> / smaps
bdonlan

1
Rozmiar współdzielony to pamięć, którą można współdzielić. Jeśli aplikacja jest jedynym użytkownikiem biblioteki, biblioteka będzie przechowywana w pamięci przez pojedynczy proces. W ten sposób nawet pamięć współdzielona może być pamięcią „procesową”.
Hubert Kario

6

W odpowiedzi Juliano:

Pamiętaj, że RSS + SHR <= VIRT, zawsze.

To tylko fałsz. SHR zawiera całą pamięć wirtualną, którą można współdzielić z innymi procesami, a RSS zawiera całą pamięć fizycznie w pamięci RAM wykorzystywanej przez proces.

Zatem cała pamięć współdzielona obecnie w RAM jest liczona zarówno w SHR, jak i RSS, więc SHR + RSS nie ma znaczenia, ponieważ może zawierać liczby duplikatów.

Aby zbudować proces z RSS + SHR> VIRT, po prostu mmap duży plik (1 GB), a następnie przeczytaj go całkowicie: plik mmaped zostanie załadowany do pamięci RAM, a VIRT, SHR i RSS będą nieco większe niż 1 GB, więc SHR + RSS> VIRT.


Tak, to było bardziej stwierdzenie o VIRT niż pozostałe dwa. To, co miałem na myśli, bardziej dotyczyło połączenia RSS i SHR niż ich sumy, tj. VIRT zawiera zarówno RSS, jak i SHR. Słaba reprezentacja matematyczna.
Juliano
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.