Maximale Speichernutzung eines Linux / Unix-Prozesses


376

Gibt es ein Tool, das eine Befehlszeile ausführt und die maximale RAM-Auslastung angibt?

Ich stelle mir etwas Analoges zu / usr / bin / time vor

Antworten:


28

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)


4
Was ist, wenn ich PID nicht kenne? Zum Beispiel für den Fall, dass das Programm eine kleine Zeitspanne (<1s)
ausführt

4
"VmHWM: Peak Resident Set Size" kann möglicherweise besser zur Messung der RAM-Nutzung verwendet werden (anstelle von VmPeak, das auch viele andere Dinge enthält).
JFS

@jfs es kommt wirklich darauf an, was du herausfinden willst. IIRC VmPeak ist die maximale Gesamtspeicherauslastung einschließlich des virtuellen Speichers, während VmHWM die maximale RAM-Auslastung ist. Wenn Sie also wissen möchten, wie viel Speicher Ihr Programm insgesamt benötigt, verwenden Sie VmPeak. Wenn Sie wissen möchten, wie viel RAM tatsächlich zu einem bestimmten Zeitpunkt verwendet wurde, verwenden Sie VmHWM.
Erobert

1
@diralik Wenn Sie ein von Ihnen selbst geschriebenes Programm überprüfen, können Sie eine Codezeile einbetten, um in die Datei "/ proc / self / status" zu schauen.
Fileland

404

[ 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

4
Wahrscheinlich gibt es immer 0 zurück, weil ls nicht viel tut. Versuchen Sie es mit einem CPU-intensiveren Befehl.
Jon Ericson

17
Über die Manpage: Die meisten nach Zeit angezeigten Informationen stammen aus dem Systemaufruf wait3 (2). Die Zahlen sind nur so gut wie die von wait3 (2) zurückgegebenen. Auf Systemen ohne einen wait3 (2) -Aufruf, der Statusinformationen zurückgibt, wird stattdessen der Systemaufruf times (2) verwendet. Es liefert jedoch viel weniger Informationen als wait3 (2), sodass auf diesen Systemen die Zeit den Großteil der Ressourcen als Null meldet.
Lothar

79
"bash: -v: Befehl nicht gefunden" bedeutet, dass bash die Zeit abfängt, um seinen eigenen zu verwenden. /bin/time -vlöst es.
GCB

3
Es lohnt sich, eine kurze Überprüfung durchzuführen, um sicherzustellen, dass die Ausgabe sinnvoll ist. Gnu Zeit hat einen Fehler, wo es 4x die tatsächliche Speichernutzung meldet
Ian

24
@skalee Try time -lon MacOS, gibt ähnliche Ausgabe.
Volker Stolz

96

(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.


1
Alles, was noch PS verwendet und nur gut ist, um den beobachteten Top-Speicher zu bestimmen. kein echter Top-Speicher. Sie können immer etwas zwischen einem Intervall und einem anderen verpassen.
GCB

6
Was sind die Einheiten für die Ausgabe des Memusg-Skripts? Bytes? Kilobyte?
Daniel Standage

1
@ DanielStandage: wahrscheinlich in Kilobyte. Es überwacht einfach die angezeigten Werte, ps -o rss=wobei rss die tatsächliche Speichergröße (residente Menge) des Prozesses (in 1024-Byte-Einheiten) aus meiner BSD-Manpage ist.
netj

3
@gcb Also, das bekommen Sie, wenn Sie Proben messen.
Volker Stolz

2
Der in der Antwort angegebene Link zu memusg scheint unterbrochen zu sein. Wie auch immer, / usr / bin / time macht das sehr gut.
Tom Cornebize

65

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


14
time, Ich verlasse dich.
jbeard4

1
Handliches Skript, aber ich brauche sort -g auf meinem Slackware-System (ich nehme an, Sie suchen nach dem höchsten Wert).
Nick Coleman

3
+1 für valgrind --massif. Sie können auch das ms_printmitgelieferte Tool für eine praktische Ausgabe verwenden (einschließlich ASCII-Nutzungsdiagrammen im Zeitverlauf)
Eli Bendersky,

7
Das Massiv hat einen viel höheren Overhead als zuvor timeund benötigt mindestens zehnmal mehr Zeit für einen Befehl wie ls.
Timothy Gu

8
Es ist in der Tat viel zu massiv. Diese Antwort sollte die Verlangsamung erwähnen. Der Befehl, den ich messen möchte, dauert normalerweise 35 Sekunden. Ich habe diesen Valgrind-Befehl ausgeführt, um ihn vor mehr als einer halben Stunde zu messen, und er ist immer noch nicht abgeschlossen…
unagi

35

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
Rolf

2
Ist dieser Grund nicht bereits durch eine Antwort abgedeckt , die zwei Jahre zuvor hinzugefügt wurde? ?
Charles Duffy

34

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.


Ich scheine damit immer Nullen zu bekommen, auch für große Befehle
jes5199

Ich erhalte variable Ergebnisse wie 400% 0 und 0% 0 für dasselbe Programm. Vielleicht sollte es für längere Zeiträume ausgeführt werden, um genau zu sein?
Liran Orevi

Ich weiß nicht, was ich vorschlagen soll. Der obige Code ist genau das, was ich dazu gebracht habe, einen Latex-Befehl auszuführen, der zufällig in der Geschichte war. Wie gesagt, mit anderen Tools können genauere Ergebnisse erzielt werden.
Jon Ericson

2
Das funktioniert zumindest auf CentOS-Systemen (und damit auch auf RHEL-Systemen). % P gibt unabhängige Statistiken (% CPU) an, die vom Scheduler abhängen und daher sehr variabel sind.
Blaisorblade

2
@Deleteman: 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.
Jon Ericson

18

/ 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 ...


1
Ich scheine damit immer Nullen zu bekommen, auch für große Befehle
jes5199

jes5199, Liran, wenn man sich die obigen Kommentare ansieht, scheint es, als ob die Zeit (1) für die Speicherberichterstattung unter einigen Linuxen unterbrochen sein könnte ...
Simon

Unter Ubuntu 16.04 sind Text und Daten Null, aber max ist ungleich Null und erzeugt einen aussagekräftigen Wert. Ich bin glücklich damit.
Stéphane Gourichon

Ich hoffe, Mmax dort bedeutet, was wir wollen, dass es bedeutet ... die Manpage ist ein wenig knapp darüber
Matanster

17

Unter MacOS Sierra verwenden Sie:

/usr/bin/time -l commandToMeasure

Sie können verwenden grep, um zu nehmen, was Sie vielleicht wollen.


5
Diese! Ich habe buchstäblich eine Stunde damit verbracht, Instruments.app und dtrace zu erhalten, um mir ein Speicherprofil mit aktivierter Systemintegrität zu geben (kann es nicht deaktivieren), während ich nur diesen einfachen Befehl brauchte. Ein kleiner Hinweis, können Sie 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.)
Jakub Arnold

16

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

1
Der Hauptnachteil dieser Methode besteht darin, dass, wenn der Prozess für einen kurzen Zeitraum (z. B. gegen Ende) viel Speicher zuweist, dies möglicherweise nicht erkannt wird. Die Verkürzung der Schlafzeit kann etwas helfen.
vinc17


8

Wenn Sie den Speicherpeak und einige detailliertere Statistiken wirklich anzeigen möchten, empfehle ich die Verwendung eines Profilers wie valgrind . Ein schönes Valgrind-Frontend ist Alleyoop .



5

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


1

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.


1

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


1

Unter macOS können Sie stattdessen DTrace verwenden. Die "Instruments" App ist eine schöne GUI dafür, sie kommt mit XCode afaik.



-2

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.