To pytanie jest szczegółowo omówione tutaj .
Jak mierzysz wykorzystanie pamięci przez aplikację lub proces w systemie Linux?
Z artykułu blogu Zrozumienia wykorzystania pamięci w systemie Linux , ps
nie jest dokładnym narzędziem do wykorzystania dla tej intencji.
Dlaczego
ps
„źle”W zależności od tego, jak na to patrzysz,
ps
nie zgłasza rzeczywistego wykorzystania pamięci przez procesy. W rzeczywistości pokazuje, ile prawdziwej pamięci zajmie każdy proces, gdyby był jedynym uruchomionym procesem . Oczywiście w typowej maszynie z Linuksem w danym momencie działa kilkadziesiąt procesów, co oznacza, że zgłoszone numery VSZ i RSSps
są prawie zdecydowanie błędne .
ps
nawet tego nie pokazuje - pokazuje numery pamięci wirtualnej i rezydentnej, gdzie wirtualna to maksymalna ilość pamięci, którą proces teoretycznie mógłby z niej skorzystać, był to jedyny proces (nigdy nie), używany na każdej przydzielonej stronie (nigdy się nie zdarza) i nie mapował ani nie mapował żadnych stron (mało prawdopodobne). Podczas gdy rezydent pokazuje, ile pamięci wirtualnej jest obecnie zamapowane na fizyczną. Zazwyczajvirt > usage > res
jednak w systemie 64-bitowymvirt ~= res*10
jest to bardzo szeroki zakres.Odpowiedzi:
Za pomocą
ps
lub podobnych narzędzi uzyskasz tylko tyle stron pamięci przydzielonych przez ten proces. Ta liczba jest poprawna, ale:nie odzwierciedla faktycznej ilości pamięci używanej przez aplikację, tylko ilość pamięci zarezerwowanej dla niej
może wprowadzać w błąd, jeśli strony są współużytkowane, na przykład przez kilka wątków lub przy użyciu dynamicznie linkowanych bibliotek
Jeśli naprawdę chcesz wiedzieć, ile pamięci faktycznie używa Twoja aplikacja, musisz uruchomić ją w programie profilującym. Na przykład
valgrind
może dać ci wgląd w ilość używanej pamięci, a co ważniejsze, o możliwych wyciekach pamięci w twoim programie. Narzędzie do profilowania sterty valgrind nazywa się „masywem”:Jak wyjaśniono w dokumentacji valgrind , musisz uruchomić program poprzez valgrind:
Massif zapisuje zrzut migawek użycia pamięci (np
massif.out.12345
.). Zapewniają one (1) oś czasu wykorzystania pamięci, (2) dla każdej migawki, zapis miejsca w pamięci programu. Świetnym narzędziem graficznym do analizy tych plików jest wizualizator masywów . Okazało się jednakms_print
, że proste narzędzie tekstowe dostarczane wraz z valgrindem jest już bardzo pomocne.Aby znaleźć wycieki pamięci, użyj (domyślnego)
memcheck
narzędzia valgrind.źródło
Wypróbuj polecenie pmap :
źródło
gnome-system-monitor
Trudno powiedzieć na pewno, ale oto dwie „bliskie” rzeczy, które mogą pomóc.
da ci wirtualny rozmiar (VSZ)
Możesz także uzyskać szczegółowe statystyki z systemu plików / proc, przechodząc do
/proc/$pid/status
Najważniejszy jest VmSize, który powinien być zbliżony do czego
ps aux
daje.źródło
gnome-system-monitor
W najnowszych wersjach systemu Linux użyj podsystemu smaps . Na przykład dla procesu o PID 1234:
Powie ci dokładnie, ile pamięci zużywa w tym czasie. Co ważniejsze, podzieli pamięć na prywatną i współużytkowaną, dzięki czemu możesz określić, ile pamięci używa Twoja instancja programu, bez uwzględniania pamięci współużytkowanej przez wiele instancji programu.
źródło
pmap
jest to prostszy interfejs.Nie ma łatwego sposobu na obliczenie tego. Ale niektórzy próbowali uzyskać dobre odpowiedzi:
źródło
ps_mem
ismem
bardzo przydatne dla środków użytkownika końcowego, podczas gdy np.pmap
bardzo szczegółowe dane wyjściowe są ukierunkowane na devs ... pozwalają odzyskać użycie pamięci Firefox dla każdej czcionki, dodatku, biblioteki lib np. Dziękuję wszystkim exp. @Bash, @thomasruther.gnome-system-monitor
Użyj smem , który jest alternatywą dla ps, która oblicza USS i PSS na proces. To, czego chcesz, to prawdopodobnie PSS.
USS - Unikalny rozmiar zestawu. Jest to ilość niewspółdzielone pamięci unikalne dla tego sposobu (myśleć jak U o wyjątkowej pamięci). Nie obejmuje pamięci współdzielonej. Zatem ta wola pod -report ilość pamięci a zastosowania proces, ale jest przydatna, gdy chcesz ignorować pamięci współdzielonej.
PSS - Proporcjonalny rozmiar zestawu. To jest to, czego chcesz. Dodaje do siebie unikalną pamięć (USS) oraz część pamięci współdzielonej podzieloną przez liczbę procesów współużytkujących tę pamięć. W ten sposób uzyskasz dokładną reprezentację ilości faktycznej pamięci fizycznej wykorzystywanej na proces - z pamięcią współdzieloną naprawdę reprezentowaną jako współdzielona. Pomyśl o P jako o pamięci fizycznej .
Jak to się porównuje do RSS, jak donosi ps i inne narzędzia:
Uwaga: smem może również (opcjonalnie) generować wykresy, takie jak wykresy kołowe i tym podobne. IMO nie potrzebujesz tego. Jeśli chcesz go używać z wiersza poleceń, tak jak możesz użyć ps -A v, nie musisz instalować zalecanej zależności python-matplotlib.
źródło
Użyj tego jako root, a każdy proces uzyska wyraźny wynik wykorzystania pamięci.
PRZYKŁAD WYJŚCIA:
źródło
x=2
wyjścia pid i użytkownika.Co
time
?Nie Bash wbudowane
time
ale można znaleźć zwhich time
, na przykład/usr/bin/time
Oto, co obejmuje, na prostym
ls
:źródło
brew install gnu-time
użyj,gtime
jeśli korzystasz z systemu macOS.To doskonałe podsumowanie narzędzi i problemów: link archive.org
Zacytuję to, aby więcej deweloperów faktycznie to przeczytało.
źródło
Oprócz rozwiązań wymienionych w twoich odpowiedziach możesz użyć polecenia Linux „top”; Zapewnia dynamiczny widok działającego systemu w czasie rzeczywistym, podaje użycie procesora i pamięci dla całego systemu wraz z każdym programem, w procentach:
aby filtrować według pid programu:
aby filtrować według nazwy programu:
„góra” zawiera także niektóre pola, takie jak:
VIRT - Virtual Image (kb): Całkowita ilość pamięci wirtualnej wykorzystywanej przez zadanie
RES - rozmiar rezydenta (kb): niezmieniona pamięć fizyczna, z której korzystało zadanie; RES = KOD + DANE.
DANE - Dane + Rozmiar stosu (kb): Ilość pamięci fizycznej przeznaczona na kod inny niż wykonywalny, znany również jako rozmiar „zestawu rezydentów danych” lub DRS.
SHR - Rozmiar pamięci współdzielonej (kb): Ilość pamięci współdzielonej wykorzystywanej przez zadanie. Po prostu odzwierciedla pamięć, którą można potencjalnie współdzielić z innymi procesami.
Odnośnik tutaj .
źródło
Nie ma na to ani jednej odpowiedzi, ponieważ nie można dokładnie określić ilości pamięci używanej przez proces. Większość procesów w systemie Linux używa bibliotek współdzielonych. Załóżmy na przykład, że chcesz obliczyć zużycie pamięci dla procesu „ls”. Czy liczysz tylko pamięć używaną przez wykonywalne „ls” (jeśli możesz ją wydzielić)? Co powiesz na libc? Lub wszystkie te inne biblioteki lib, które są wymagane do uruchomienia „ls”?
Można argumentować, że są one współużytkowane przez inne procesy, ale „ls” nie można uruchomić w systemie bez ich załadowania.
Ponadto, jeśli chcesz wiedzieć, ile pamięci potrzebuje proces do planowania wydajności, musisz obliczyć, ile zużywa każda dodatkowa kopia procesu. Myślę, że / proc / PID / status może dać ci wystarczającą ilość informacji o zużyciu pamięci. Z drugiej strony valgrind zapewni lepszy profil wykorzystania pamięci przez cały okres istnienia programu
źródło
pmap
Jeśli Twój kod jest w C lub C ++, możesz być w stanie go użyć
getrusage()
co zwróci różne statystyki dotyczące wykorzystania pamięci i czasu przez proces.Nie wszystkie platformy obsługują to i zwrócą 0 wartości dla opcji użycia pamięci.
Zamiast tego możesz spojrzeć na plik wirtualny utworzony w
/proc/[pid]/statm
(gdzie[pid]
jest zastąpiony identyfikatorem procesu. Możesz to uzyskać zgetpid()
).Ten plik będzie wyglądał jak plik tekstowy z 7 liczbami całkowitymi. Prawdopodobnie najbardziej interesują Cię pierwsze (całe użycie pamięci) i szóste (użycie pamięci danych) liczby w tym pliku.
źródło
getpid()
, ponieważ nie znamgetprocessid()
funkcji w C / C ++ pod Linuksem.Valgrind może wyświetlać szczegółowe informacje, ale znacznie spowalnia aplikację docelową i przez większość czasu zmienia zachowanie aplikacji.
Exmap był czymś, czego jeszcze nie znałem, ale wydaje się, że potrzebujesz modułu jądra, aby uzyskać informacje, które mogą być przeszkodą.
Zakładam, że każdy, kto chce wiedzieć o „wykorzystaniu pamięci” WRT, jest następujący:
W systemie Linux ilość pamięci fizycznej, którą może wykorzystać pojedynczy proces, można z grubsza podzielić na następujące kategorie.
Ma anonimową pamięć mapowaną
Mn nazwana pamięć mapowana
Narzędzie zawarte w systemie Android o nazwie showmap jest dość przydatne
źródło
Trzy kolejne metody do wypróbowania:
ps aux --sort pmem
Sortuje dane wyjściowe według
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Sortuje za pomocą rur.
top -a
Zaczyna się najlepsze sortowanie według
%MEM
(Wyodrębniono stąd )
źródło
top
i prawdopodobnie inni nie dają dokładnej reprezentacji pamięci faktycznie używanej przez proces. Na przykład mam 64 GB pamięci RAM i mam 10postgres
procesów raportujących 16 GB RES i 25% MEM. Oczywiście nie wszyscy używają 25% ... Każdy z nich ma również 15GiB SHR i wygląda na to, że je dzielą.źródło
sed | awk
i działa w Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Używam
htop
; jest to bardzo dobry program konsoli podobny do Menedżera zadań Windows.źródło
htop
i jest lepszy niż górny, ale nadal pokaże wszystkie wątki z różnych aplikacji bez grupowania ich, co czyni go prawie tak bezużytecznym jak górny.Jeśli proces nie zużywa zbyt dużo pamięci (albo dlatego, że spodziewane jest, że tak się dzieje, albo jakieś inne polecenie dało to wstępne wskazanie), a proces może wytrzymać zatrzymanie na krótki czas, możesz spróbować użyj polecenia gcore.
Sprawdź rozmiar wygenerowanego pliku podstawowego, aby uzyskać dobry pomysł na ilość pamięci używanej przez dany proces.
Nie zadziała to zbyt dobrze, jeśli proces wykorzystuje setki megabajtów lub koncertów, ponieważ tworzenie rdzenia może potrwać kilka sekund lub minut, w zależności od wydajności we / wy. Podczas tworzenia rdzenia proces zostaje zatrzymany (lub „zamrożony”), aby zapobiec zmianom pamięci. Więc uważaj.
Upewnij się również, że punkt podłączenia, w którym generowany jest rdzeń, ma dużo miejsca na dysku i że system nie zareaguje negatywnie na tworzenie pliku rdzenia w tym konkretnym katalogu.
źródło
Korzystam z Arch Linux i jest ten cudowny pakiet o nazwie
ps_mem
Przykładowy wynik
źródło
Poniższa linia poleceń podaje całkowitą pamięć używaną przez różne procesy uruchomione na komputerze z systemem Linux w MB
źródło
Dobrym testem wykorzystania bardziej „rzeczywistego świata” jest otwarcie aplikacji, a następnie uruchomienie
vmstat -s
i sprawdzenie statystyki „pamięci aktywnej”. Zamknij aplikację, poczekaj kilka sekund i uruchomvmstat -s
ponownie. Jakkolwiek zwolniona została aktywna pamięć, widocznie była używana przez aplikację.źródło
Zdobądź valgrind. daj mu swój program do uruchomienia, a powie ci wiele o zużyciu pamięci.
Miałoby to zastosowanie tylko w przypadku programu, który działa przez pewien czas i zatrzymuje się. Nie wiem, czy valgrind może zdobyć już działający proces, czy też nie powinien zatrzymać procesów takich jak demony.
źródło
Edycja: działa to w 100% dobrze tylko wtedy, gdy wzrasta zużycie pamięci
Jeśli chcesz monitorować wykorzystanie pamięci przez dany proces (lub grupę przetworzonych współużytkowanych wspólnych nazw, np.
google-chrome
Możesz użyć mojego skryptu bash:to będzie stale szukało zmian i je drukowało.
źródło
Jeśli chcesz czegoś szybszego niż profilowanie za pomocą Valgrind, a twoje jądro jest starsze i nie możesz używać smapów, ps z opcjami pokazania zestawu rezydentnego procesu (z
ps -o rss,command
) może dać ci szybką i rozsądną_aproximation_
rzeczywistą ilość używana pamięć nie wymieniona.źródło
Sugerowałbym, abyś używał na szczycie. Możesz znaleźć wszystko na ten temat na tej stronie . Jest w stanie zapewnić wszystkie niezbędne KPI dla twoich procesów, a także może przechwytywać do pliku.
źródło
atop -R
. Aby wyświetlić podsumowanie wypychania według użytkownikap
, aby posortować według zużycia pamięci, wciśnij„ M ”od góry. Daje to podobne liczby niż smem.Sprawdź skrypt powłoki, aby sprawdzić użycie pamięci przez aplikację w systemie Linux . Dostępne również na github oraz w wersji bez wklejania i bc .
źródło
Kolejny głos na valgrindtutaj, ale chciałbym dodać, że możesz użyć narzędzia takiego jak Alleyoop, aby pomóc w interpretacji wyników generowanych przez valgrind.
Używam tych dwóch narzędzi przez cały czas i zawsze mam szczupły, nieszczelny kod, który z dumą pokazuję;)
źródło
Chociaż wydaje się, że to pytanie dotyczy badania aktualnie działających procesów, chciałem zobaczyć maksymalną pamięć używaną przez aplikację od początku do końca. Oprócz valgrind, możesz używać tstime , który jest znacznie prostszy. Mierzy zużycie pamięci „highwater” (RSS i wirtualne). Z tej odpowiedzi .
źródło
Na podstawie odpowiedzi na powiązane pytanie .
Możesz użyć SNMP, aby uzyskać pamięć i użycie procesora przez proces na określonym urządzeniu w sieci :)
Wymagania:
Uwagi:
HOST-RESOURCES-MIB :: hrSWRunPerfCPU to liczba centów sekund całkowitego zużycia zasobów procesora przez system. Należy pamiętać, że w systemie wieloprocesorowym wartość ta może wzrosnąć o więcej niż jeden centi-sekundę w jednym centy-sekundie czasu rzeczywistego (zegar ścienny).
HOST-RESOURCES-MIB :: hrSWRunPerfMem to całkowita ilość rzeczywistej pamięci systemowej przydzielonej dla tego procesu.
**
Skrypt monitorowania procesu:
**
źródło
/ prox / xxx / numa_maps podaje tam trochę informacji: N0 = ??? N1 = ???. Ale ten wynik może być niższy niż rzeczywisty, ponieważ uwzględnia tylko te, które zostały dotknięte.
źródło
Użyj wbudowanego narzędzia GUI do monitorowania systemu dostępnego w Ubuntu
źródło