Odpowiedzi:
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ń $PID
na PID interesującego Cię procesu)
[ 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 size
Poniż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
/bin/time -v
rozwiązuje to.
time -l
na MacOS, daje podobne wyniki.
(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.
ps -o rss=
gdzie rss to rzeczywisty rozmiar pamięci (zestaw rezydentny) procesu (w jednostkach 1024-bajtowych) z mojej strony podręcznika BSD.
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
time
, Zostawiam cię.
valgrind --massif
. Można również użyć ms_print
dołączonego narzędzia do poręcznego wydruku (w tym wykresów zużycia ascii w czasie)
time
, zajmuje co najmniej 10 razy więcej czasu na polecenia takie jak ls
.
W systemie Linux:
Użyj /usr/bin/time -v <program> <args>
i wyszukaj „ Maksymalny rozmiar zestawu rezydenta ”.
(Nie mylić z Basha time
wbudowanego 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
. . .
sudo apt-get install time
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.
time
jest 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.
/ 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 ...
W systemie MacOS Sierra użyj:
/usr/bin/time -l commandToMeasure
Możesz użyć, grep
aby wziąć to, co chcesz.
command time -l
zamiast tego /usr/bin/time -l
spowoduje, że twoja powłoka faktycznie wywoła binarne wywołanie time
zamiast wbudowanej funkcji. (Tak, command
nie jest symbolem zastępczym, command time
jest inny niż tylko time
.)
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 rss
dowolny inny atrybut, który Cię interesuje). Jest nieco lekki i działa dla mnie z ps
zawartym 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
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 .
Aby to zrobić, możesz użyć narzędzia takiego jak Valgrind .
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
Użyj Massif: http://valgrind.org/docs/manual/ms-manual.html
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ę Pss
w /proc/[pid]/smaps
lub wykorzystanie pmap
. GNOME monitor-system to robił, ale było to zbyt drogie.
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
W systemie macOS zamiast tego można użyć DTrace. Aplikacja „Instruments” jest do tego przyjemnym GUI, jest dostarczana z XCode afaik.
„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
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 top
polecenie 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.sh
Nigdy 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