Antworten:
Hier ist ein Einzeiler, für den keine externen Skripte oder Dienstprogramme erforderlich sind und für den Sie den Prozess nicht über ein anderes Programm wie Valgrind oder time starten müssen, damit Sie ihn für jeden Prozess verwenden können, der bereits ausgeführt wird:
grep VmPeak /proc/$PID/status
(durch $PIDdie PID des Prozesses ersetzen, an dem Sie interessiert sind)
[ Bearbeiten : Funktioniert unter Ubuntu 14.04: Stellen /usr/bin/time -v command Sie sicher, dass Sie den vollständigen Pfad verwenden.]
Sieht so /usr/bin/timeaus, als ob Sie -vdiese Informationen erhalten, wenn Sie bestehen (dies ist unter Ubuntu 8.10). Siehe zB Maximum resident set sizeunten:
$ / usr / bin / time -v ls /
....
Befehl wird zeitgesteuert: "ls /"
Benutzerzeit (Sekunden): 0,00
Systemzeit (Sekunden): 0,01
Prozent der CPU, die dieser Job erhalten hat: 250%
Verstrichene Zeit (Wanduhr) (h: mm: ss oder m: ss): 0: 00.00
Durchschnittliche Größe des gemeinsam genutzten Textes (KB): 0
Durchschnittliche nicht gemeinsam genutzte Datengröße (KB): 0
Durchschnittliche Stapelgröße (KB): 0
Durchschnittliche Gesamtgröße (KB): 0
Maximale Größe des residenten Satzes (KB): 0
Durchschnittliche Größe des residenten Satzes (KB): 0
Hauptfehler (für die E / A erforderlich sind): 0
Kleinere Seitenfehler (Zurückfordern eines Frames): 315
Freiwillige Kontextwechsel: 2
Unwillkürliche Kontextwechsel: 0
Swaps: 0
Dateisystemeingaben: 0
Dateisystemausgaben: 0
Socket-Nachrichten gesendet: 0
Empfangene Socket-Nachrichten: 0
Gelieferte Signale: 0
Seitengröße (Bytes): 4096
Ausgangsstatus: 0
/bin/time -vlöst es.
time -lon MacOS, gibt ähnliche Ausgabe.
(Dies ist eine bereits beantwortete, alte Frage .. aber nur für die Aufzeichnung :)
Ich wurde von Yangs Drehbuch inspiriert und kam auf dieses kleine Werkzeug namens memusg . Ich habe einfach die Abtastrate auf 0,1 erhöht, um viele kurzlebige Prozesse zu bewältigen. Anstatt einen einzelnen Prozess zu überwachen, habe ich ihn dazu gebracht, die RSS-Summe der Prozessgruppe zu messen. (Ja, ich schreibe viele separate Programme, die zusammenarbeiten.) Es funktioniert derzeit unter Mac OS X und Linux. Die Verwendung musste ähnlich sein wie bei time:
memusg ls -alR /> / dev / null
Es zeigt momentan nur den Höhepunkt, aber ich bin an geringfügigen Erweiterungen für die Aufzeichnung anderer (grober) Statistiken interessiert.
Es ist gut, ein so einfaches Tool zu haben, um einen Blick darauf zu werfen, bevor wir mit einer ernsthaften Profilerstellung beginnen.
ps -o rss=wobei rss die tatsächliche Speichergröße (residente Menge) des Prozesses (in 1024-Byte-Einheiten) aus meiner BSD-Manpage ist.
Valgrind Einzeiler:
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
Beachten Sie die Verwendung von --pages-as-heap, um den gesamten Speicher in einem Prozess zu messen. Weitere Informationen hier: http://valgrind.org/docs/manual/ms-manual.html
time, Ich verlasse dich.
valgrind --massif. Sie können auch das ms_printmitgelieferte Tool für eine praktische Ausgabe verwenden (einschließlich ASCII-Nutzungsdiagrammen im Zeitverlauf)
timeund benötigt mindestens zehnmal mehr Zeit für einen Befehl wie ls.
Unter Linux:
Verwenden Sie /usr/bin/time -v <program> <args>und suchen Sie nach " Maximale Größe des residenten Satzes ".
(Nicht zu verwechseln mit dem timeintegrierten Befehl Bash ! Verwenden Sie also den vollständigen Pfad . /usr/bin/time)
Zum Beispiel:
> /usr/bin/time -v ./myapp
User time (seconds): 0.00
. . .
Maximum resident set size (kbytes): 2792
. . .
Unter BSD, MacOS:
Verwenden Sie /usr/bin/time -l <program> <args>, um nach " maximaler Resident-Set-Größe " zu suchen :
>/usr/bin/time -l ./myapp
0.01 real 0.00 user 0.00 sys
1440 maximum resident set size
. . .
sudo apt-get install time
Vielleicht macht (gnu) time (1) schon was du willst. Zum Beispiel:
$ /usr/bin/time -f "%P %M" command
43% 821248
Andere Profiling-Tools liefern jedoch möglicherweise genauere Ergebnisse, je nachdem, wonach Sie suchen.
timeist ein eingebauter Befehl bei der Verwendung csh. Wenn Sie den genauen Pfad verwenden, können Sie den externen Befehl ausführen. Soweit ich weiß, unterstützt nur die GNU-Version die Formatierungsoption.
/ usr / bin / time macht vielleicht tatsächlich das, was Sie wollen. Etwas wie.
/ usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'
Siehe Zeit (1) für Details ...
Unter MacOS Sierra verwenden Sie:
/usr/bin/time -l commandToMeasure
Sie können verwenden grep, um zu nehmen, was Sie vielleicht wollen.
command time -lanstelle von /usr/bin/time -ldenen Shell bewirken tatsächlich eine binäre genannt rufen timestatt der eingebauten Funktion. (Ja, commandist kein Platzhalter, command timeist anders als nur time.)
Wenn der Prozess mindestens ein paar Sekunden lang ausgeführt wird, können Sie das folgende Bash-Skript verwenden, das die angegebene Befehlszeile ausführt und dann druckt, um den Spitzen-RSS-Wert zu sternr (Ersatz für rssjedes andere Attribut, an dem Sie interessiert sind). Es ist etwas leicht und funktioniert für mich mit dem psin Ubuntu 9.04 enthaltenen (was ich nicht sagen kann 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
Sie können dazu ein Tool wie Valgrind verwenden.
Hier ist (basierend auf den anderen Antworten) ein sehr einfaches Skript, das einen bereits laufenden Prozess überwacht. Sie führen es einfach mit der PID des Prozesses aus, den Sie als Argument ansehen möchten:
#!/usr/bin/env bash
pid=$1
while ps $pid >/dev/null
do
ps -o vsz= ${pid}
sleep 1
done | sort -n | tail -n1
Anwendungsbeispiel:
max_mem_usage.sh 23423
Verwenden Sie Massif: http://valgrind.org/docs/manual/ms-manual.html
Heaptrack ist ein KDE-Tool mit einer GUI und einer . Ich finde es besser geeignet als valgrind, die Speichernutzung eines Prozesses zu verstehen, da es mehr Details und Flammengraphen enthält. Es ist auch schneller, weil es weniger Valgrind überprüft. Und es gibt Ihnen die maximale Speichernutzung.
Wie auch immer, das Verfolgen von RSS und VSS ist irreführend, da Seiten geteilt werden könnten. Deshalb memusg. Was Sie wirklich tun sollten, ist die Summe von PssIn /proc/[pid]/smapsoder Verwendung zu verfolgen pmap. Früher war dies der GNOME-Systemmonitor, der jedoch zu teuer war.
Das Rad neu erfinden, mit handgemachtem Bash-Skript. Schnell und sauber.
Mein Anwendungsfall: Ich wollte einen Linux-Computer überwachen, der weniger RAM hat, und wollte eine Momentaufnahme der Nutzung pro Container machen, wenn er unter starker Auslastung ausgeführt wird.
#!/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
Beispielausgabe:
2017-10-12 13:29:33: Ausführen eines freien Speichermonitors mit einem Schwellenwert von 30%.
2017-10-12 13:29:33: Ausreichend freier Speicher verfügbar: 69.4567%
2017-10-12 13:30:03: Ausreichend freier Speicher verfügbar: 69,4567%
2017-10-12 16:47:02: Freier Speicher 18.9387% ist weniger als 30%
Ihre benutzerdefinierte Befehlsausgabe
Unter macOS können Sie stattdessen DTrace verwenden. Die "Instruments" App ist eine schöne GUI dafür, sie kommt mit XCode afaik.
'htop' ist der beste Befehl, um zu sehen, welcher Prozess wie viel RAM verwendet .....
Weitere Informationen finden Sie unter http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
Bitte beantworten Sie die Frage unbedingt. Geben Sie Details an und teilen Sie Ihre Forschung!
Entschuldigung, ich bin zum ersten Mal hier und kann nur Fragen stellen ...
Verwendet empfohlen:
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
dann:
grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...
Dies unterscheidet sich sehr von dem, was der topBefehl in einem ähnlichen Moment anzeigt:
14673 gu27mox 20 0 3280404 468380 19176 R 100.0 2.9 6:08.84 pwanew_3pic_com
Was sind gemessene Einheiten von Valgrind?
Das /usr/bin/time -v ./test.shnie beantwortet - Sie müssen die ausführbare Datei direkt füttern, um zu /usr/bin/timemögen:
/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