Maksymalne wykorzystanie pamięci przez proces linux / unix

376

Czy istnieje narzędzie, które uruchomi wiersz poleceń i zgłosi całkowite szczytowe użycie pamięci RAM?

Wyobrażam sobie coś analogicznego do / usr / bin / time

jes5199
źródło

Odpowiedzi:

28

Oto jeden linijka, która nie wymaga żadnych zewnętrznych skryptów ani narzędzi i nie wymaga uruchamiania procesu za pośrednictwem innego programu, takiego jak Valgrind lub time, dzięki czemu można go używać w dowolnym już uruchomionym procesie:

grep VmPeak /proc/$PID/status

(zamień $PIDna PID interesującego Cię procesu)

erobertc
źródło
4
Co jeśli nie znam PID? Na przykład w przypadku, gdy program działa przez
krótki
4
„VmHWM: rozmiar rezydentnego zestawu pików” może być bardziej użyteczny do pomiaru zużycia pamięci RAM (zamiast VmPeak, który zawiera również wiele innych rzeczy).
jfs
@ jfs to naprawdę zależy od tego, czego chcesz się dowiedzieć. IIRC VmPeak to maksymalne całkowite użycie pamięci, w tym pamięci wirtualnej, natomiast VmHWM to maksymalne użycie pamięci RAM. Więc jeśli chcesz poznać całkowitą ilość pamięci, o którą poprosił twój program, użyj VmPeak; jeśli chcesz wiedzieć, ile rzeczywistej pamięci RAM kiedykolwiek zużyło w danym momencie, użyj VmHWM.
erobertc
1
@ diralik, jeśli sprawdzasz napisany przez siebie program, możesz osadzić wiersz kodu, aby przejrzeć plik „/ proc / self / status”.
Fileland
404

[ Edytuj : Działa na Ubuntu 14.04: /usr/bin/time -v command Upewnij się, że używasz pełnej ścieżki.]

Wygląda na to, /usr/bin/timeże daje ci te informacje, jeśli zdasz -v(dotyczy to Ubuntu 8.10). Zobacz np. Maximum resident set sizePoniżej:

$ / usr / bin / time -v ls /
…
        Czas wykonywania polecenia: „ls /”
        Czas użytkownika (sekundy): 0,00
        Czas systemowy (sekundy): 0,01
        Procent procesora, jaki dostało to zadanie: 250%
        Czas, który upłynął (zegar ścienny) (h: mm: ss lub m: ss): 0: 00.00
        Średni rozmiar udostępnianego tekstu (w kilobajtach): 0
        Średni nieudostępniony rozmiar danych (kB): 0
        Średni rozmiar stosu (w kilobajtach): 0
        Średni całkowity rozmiar (w kilobajtach): 0
        Maksymalny rozmiar zestawu rezydenta (kB): 0
        Średni rozmiar zestawu rezydenta (w kilobajtach): 0
        Główne (wymagające We / Wy) błędy strony: 0
        Niewielkie (odzyskiwanie ramki) błędy strony: 315
        Dobrowolne przełączniki kontekstu: 2
        Mimowolne przełączniki kontekstu: 0
        Swapy: 0
        Wejścia systemu plików: 0
        Wyjścia systemu plików: 0
        Wysłane wiadomości z gniazdami: 0
        Otrzymane wiadomości z gniazda: 0
        Dostarczone sygnały: 0
        Rozmiar strony (bajty): 4096
        Status wyjścia: 0
Jacob Gabrielson
źródło
4
Prawdopodobnie zawsze zwraca 0, ponieważ ls niewiele robi. Spróbuj wykonać polecenie bardziej obciążające procesor.
Jon Ericson
17
Ze strony podręcznika man: Większość informacji wyświetlanych według czasu pochodzi z wywołania systemowego wait3 (2). Liczby są tak dobre, jak te zwrócone przez wait3 (2). W systemach, które nie mają wywołania wait3 (2), które zwraca informacje o statusie, zamiast tego używane jest wywołanie systemowe times (2). Dostarcza jednak znacznie mniej informacji niż wait3 (2), więc w tych systemach czas raportuje większość zasobów jako zero.
lothar
79
„bash: -v: polecenie nie znaleziono” oznacza, że ​​bash przechwytuje czas, aby użyć własnego. /bin/time -vrozwiązuje to.
gcb
3
Warto byłoby zrobić szybkie sprawdzenie, aby upewnić się, że wyjście ma sens. Gnu ma błąd, w którym zgłosi 4x rzeczywiste użycie pamięci: stackoverflow.com/questions/10035232/…
Ian
24
@skalee Wypróbuj time -lna MacOS, daje podobne wyniki.
Volker Stolz
96

(To już stare pytanie, na które odpowiedziano ... ale tylko dla przypomnienia :)

Zainspirował mnie scenariusz Yang i wymyśliłem to małe narzędzie o nazwie memusg . Po prostu zwiększyłem częstotliwość próbkowania do 0,1, aby obsłużyć znacznie krótsze procesy życiowe. Zamiast monitorować pojedynczy proces, postanowiłem zmierzyć sumę rss grupy procesów. (Tak, piszę wiele osobnych programów, które ze sobą współpracują) Obecnie działa na Mac OS X i Linux. Użycie musiało być podobne do time:

memusg ls -alR /> / dev / null

Pokazuje tylko chwilową wartość szczytową, ale interesują mnie niewielkie rozszerzenia do rejestrowania innych (przybliżonych) statystyk.

Dobrze jest mieć takie proste narzędzie do obejrzenia przed rozpoczęciem poważnego profilowania.

netj
źródło
1
wszystko, co nadal korzysta z PS i jest dobre tylko do określenia obserwowanej najwyższej pamięci. nie prawdziwa najwyższa pamięć. zawsze możesz przeoczyć coś pomiędzy jednym interwałem a drugim.
gcb
6
Jakie są jednostki wyjściowe skryptu memusg? Bajty? Kilobajty?
Daniel Standage
1
@DanielStandage: prawdopodobnie w kilobajtach. Po prostu obserwuje wartości pokazane przez ps -o rss=gdzie rss to rzeczywisty rozmiar pamięci (zestaw rezydentny) procesu (w jednostkach 1024-bajtowych) z mojej strony podręcznika BSD.
netj
3
@ gcb Więc co, właśnie to dostajesz, gdy mierzysz próbki.
Volker Stolz
2
Link do notatki podany w odpowiedzi wydaje się być zepsuty. W każdym razie / usr / bin / time robi to bardzo dobrze.
Tom Cornebize,
65

Valgrind one-liner:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

Zwróć uwagę na użycie opcji --pages-as-heap do pomiaru całej pamięci w procesie. Więcej informacji tutaj: http://valgrind.org/docs/manual/ms-manual.html

jbeard4
źródło
14
time, Zostawiam cię.
jbeard4
1
Przydatny skrypt, ale potrzebuję sort -g na moim systemie Slackware (zakładam, że szukasz najwyższej wartości).
Nick Coleman
3
+1 dla valgrind --massif. Można również użyć ms_printdołączonego narzędzia do poręcznego wydruku (w tym wykresów zużycia ascii w czasie)
Eli Bendersky
7
Masyw ma znacznie większy koszt niż w rzeczywistości time, zajmuje co najmniej 10 razy więcej czasu na polecenia takie jak ls.
Timothy Gu
8
To naprawdę zbyt masywne. Ta odpowiedź powinna wspomnieć o spowolnieniu. Wykonanie polecenia, które chcę zmierzyć, zajmuje zwykle 35 sekund. Uruchomiłem to polecenie valgrind, aby zmierzyć go ponad pół godziny temu, i nadal nie zostało ono ukończone…
unagi
35

W systemie Linux:

Użyj /usr/bin/time -v <program> <args>i wyszukaj „ Maksymalny rozmiar zestawu rezydenta ”.

(Nie mylić z Basha timewbudowanego polecenia! Więc używać pełnej ścieżki , /usr/bin/time)

Na przykład:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

Na BSD, MacOS:

Użyj /usr/bin/time -l <program> <args>, szukając „ maksymalnego rozmiaru zestawu rezydenta ”:

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .
rustyx
źródło
sudo apt-get install time
Rolf
2
Czy ten grunt nie jest już objęty odpowiedzią dodaną dwa lata wcześniej ?
Charles Duffy,
34

Być może czas (gnu) (1) robi już to, co chcesz. Na przykład:

$ /usr/bin/time -f "%P %M" command
43% 821248

Ale inne narzędzia do profilowania mogą dawać dokładniejsze wyniki w zależności od tego, czego szukasz.

Jon Ericson
źródło
Wydaje mi się, że zawsze dostaję zera, nawet w przypadku dużych poleceń
jes5199
Otrzymuję zmienne wyniki, takie jak 400% 0 i 0% 0 w tym samym programie .. może to powinno być uruchamiane przez dłuższy czas, aby być dokładnym?
Liran Orevi
Nie wiem co zasugerować. Powyższy kod jest dokładnie tym, co dostałem, wykonując polecenie lateksowe, które zdarzyło się w historii. Jak mówię, dokładniejsze wyniki można uzyskać za pomocą innych narzędzi.
Jon Ericson
2
Działa to przynajmniej na systemach CentOS (a więc, założę się, także na RHEL). % P daje niepowiązane statystyki (% CPU), które zależą od harmonogramu, a zatem są dość zmienne.
Blaisorblade,
2
@Deleteman: timejest wbudowanym poleceniem podczas używania csh. Jeśli użyjesz dokładnej ścieżki, pozwoli ci to uruchomić zewnętrzne polecenie. O ile mi wiadomo, tylko wersja GNU obsługuje opcję formatowania.
Jon Ericson
18

/ usr / bin / time może faktycznie robić to, co chcesz. Coś jak.

 / usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'

Zobacz czas (1), aby uzyskać szczegółowe informacje ...

Szymon
źródło
1
Wydaje mi się, że zawsze dostaję zera, nawet dla dużych poleceń
jes5199
jes5199, Liran, patrząc na powyższe komentarze, wydaje się, że czas (1) może być zepsuty dla raportowania pamięci w niektórych linuksach ...
simon
W Ubuntu 16.04 tekst i dane są zerowe, ale maksimum jest niezerowe i daje znaczącą wartość. Jestem z tego zadowolony.
Stéphane Gourichon
Mam nadzieję, że Mmax oznacza, co chcemy przez to oznaczać .... strona podręcznika jest trochę zwięzła
Matanster
17

W systemie MacOS Sierra użyj:

/usr/bin/time -l commandToMeasure

Możesz użyć, grepaby wziąć to, co chcesz.

gsamaras
źródło
5
To! Dosłownie spędziłem godzinę próbując pobrać Instruments.app i dtrace, aby dać mi profil pamięci z włączoną integralnością systemu (nie mogę go wyłączyć), podczas gdy wszystko, czego potrzebowałem, to tylko to proste polecenie. Mała uwaga, której możesz użyć command time -lzamiast tego /usr/bin/time -lspowoduje, że twoja powłoka faktycznie wywoła binarne wywołanie timezamiast wbudowanej funkcji. (Tak, commandnie jest symbolem zastępczym, command timejest inny niż tylko time.)
Jakub Arnold
16

Jeśli proces działa przez co najmniej kilka sekund, możesz użyć następującego skryptu bash, który uruchomi podaną linię poleceń, a następnie wydrukuje, aby ustawić stderr szczytowego kanału RSS (zastąp rssdowolny inny atrybut, który Cię interesuje). Jest nieco lekki i działa dla mnie z pszawartym w Ubuntu 9.04 (czego nie mogę powiedzieć time).

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2
Yang
źródło
1
Główną wadą tej metody jest to, że jeśli proces przydziela dużo pamięci na krótki okres (np. Pod koniec), może to nie zostać wykryte. Skrócenie czasu snu może trochę pomóc.
vinc17
11
time -f '%M' <run_program>
Jason
źródło
8

Cóż, jeśli naprawdę chcesz pokazać szczyt pamięci i bardziej szczegółowe statystyki, polecam użycie profilera, takiego jak valgrind . Ładnym frontgralem valgrind jest alleyoop .

alexn
źródło
5

Aby to zrobić, możesz użyć narzędzia takiego jak Valgrind .

Dana the Sane
źródło
5

Oto (w oparciu o inne odpowiedzi) bardzo prosty skrypt, który obserwuje już uruchomiony proces. Po prostu uruchom go z pid procesu, który chcesz obejrzeć jako argument:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

Przykładowe użycie:

max_mem_usage.sh 23423
static_rtti
źródło
1

Heaptrack to narzędzie KDE z interfejsem graficznym i graficznym. Uważam, że bardziej odpowiednie niż valgrind jest zrozumienie wykorzystania pamięci przez proces, ponieważ zapewnia on więcej szczegółów i flamegraph. Jest także szybszy, ponieważ mniej sprawdza sprawdzanie tego walgrinda. I zapewnia maksymalne wykorzystanie pamięci.

W każdym razie śledzenie rss i vss jest mylące, ponieważ strony mogą być udostępniane, dlatego właśnie memusg. Co należy zrobić, to naprawdę śledzić sumę Pssw /proc/[pid]/smapslub wykorzystanie pmap. GNOME monitor-system to robił, ale było to zbyt drogie.

Benoit
źródło
1

Ponowne wynalezienie koła z ręcznie wykonanym skryptem bashowym. Szybko i czysto.

Mój przypadek użycia: Chciałem monitorować maszynę z systemem Linux, która ma mniej pamięci RAM, i chciałem zrobić migawkę użycia każdego kontenera, gdy działa on przy dużym obciążeniu.

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

Przykładowe dane wyjściowe:

2017-10-12 13:29:33: Uruchamianie monitora wolnej pamięci z progiem 30% ..

2017-10-12 13:29:33: Dostępna wystarczająca ilość wolnej pamięci: 69.4567%

2017-10-12 13:30:03: Wystarczająca ilość dostępnej wolnej pamięci: 69.4567%

2017-10-12 16:47:02: Wolna pamięć 18,9387% to mniej niż 30%

niestandardowe dane wyjściowe polecenia

Sankarganesh Eswaran
źródło
1

W systemie macOS zamiast tego można użyć DTrace. Aplikacja „Instruments” jest do tego przyjemnym GUI, jest dostarczana z XCode afaik.

Michael Böckling
źródło
0

„htop” jest najlepszym poleceniem, aby zobaczyć, który proces zużywa ile pamięci RAM…

po więcej szczegółów http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

Sanket
źródło
3
htop nie wymienia użycia SZCZYTU. Tylko bieżące użycie. (Chyba, że ​​wiesz coś, czego nie wiem. Jak wczoraj szukałem w htopie tego dokładnego scenariusza.)
Katastic Voyage
-2

Proszę odpowiedzieć na pytanie. Podaj szczegóły i udostępnij swoje badania!

Przepraszam, jestem tu pierwszy raz i mogę zadawać tylko pytania…

Zastosowane sugerowane:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

następnie:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

to bardzo różni się od tego, które toppolecenie pokazuje w podobnym momencie:

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

jakie są mierzone jednostki z Valgrind?

/usr/bin/time -v ./test.shNigdy nie odpowiedział - należy karmić bezpośrednio do pliku wykonywalnego /usr/bin/time, takich jak:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
ryabchik
źródło