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 $PID
die 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/time
aus, als ob Sie -v
diese Informationen erhalten, wenn Sie bestehen (dies ist unter Ubuntu 8.10). Siehe zB Maximum resident set size
unten:
$ / 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 -v
löst es.
time -l
on 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_print
mitgelieferte Tool für eine praktische Ausgabe verwenden (einschließlich ASCII-Nutzungsdiagrammen im Zeitverlauf)
time
und 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 time
integrierten 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.
time
ist 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 -l
anstelle von /usr/bin/time -l
denen Shell bewirken tatsächlich eine binäre genannt rufen time
statt der eingebauten Funktion. (Ja, command
ist kein Platzhalter, command time
ist 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 rss
jedes andere Attribut, an dem Sie interessiert sind). Es ist etwas leicht und funktioniert für mich mit dem ps
in 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 Pss
In /proc/[pid]/smaps
oder 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 top
Befehl 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.sh
nie beantwortet - Sie müssen die ausführbare Datei direkt füttern, um zu /usr/bin/time
mö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