it-swarm.com.de

Maximale Speichernutzung eines Linux / Unix-Prozesses

Gibt es ein Tool, das eine Befehlszeile ausführt und den Spitzenwert RAM Gesamtverbrauch) meldet?

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

348
jes5199

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. Sie können ihn also für jeden Prozess verwenden, der bereits ausgeführt wird:

grep VmPeak /proc/$PID/status

(Ersetzen Sie $PID mit der PID des Prozesses, an dem Sie interessiert sind)

11
erobertc

[Edit: Funktioniert unter Ubuntu 14.04: /usr/bin/time -v command Achten Sie darauf, den vollständigen Pfad zu verwenden.]

Sieht so aus, als ob /usr/bin/time Ihnen diese Informationen liefert, wenn Sie -v Übergeben (dies ist unter Ubuntu 8.10 der Fall). Siehe z. B. Maximum resident set size Unten:

 $/usr/bin/time -v ls /[.____.‹....
 Zeitgesteuerter Befehl: "ls /"
 Benutzerzeit (Sekunden): 0.00 
 Systemzeit (Sekunden): 0,01 
 Prozentsatz der CPU, die dieser Job erhalten hat: 250% 
 Verstrichene Zeit (Wanduhr) (h: mm: ss oder m: ss): 0 : 00.00 
 Durchschnittliche Größe des freigegebenen Texts (KB): 0 
 Durchschnittliche Größe der nicht freigegebenen Daten (KB): 0 
 Durchschnittliche Stapelgröße (KB): 0 
 Durchschnittliche Gesamtgröße size (kbytes): 0 
 Maximale residente Satzgröße (kbytes): 0 
 Durchschnittliche residente Satzgröße (kbytes): 0 
 Schwerwiegende (erforderliche E/A-) Seitenfehler: 0 
 Kleinere Seitenfehler (bei der Wiederherstellung eines Frames): 315 
 Freiwillige Kontextwechsel: 2 
 Unfreiwillige Kontextwechsel: 0 
 Auslagerungen: 0 
 Dateisystem Eingaben: 0 
 Dateisystemausgaben: 0 
 Socket-Nachrichten gesendet: 0 
 Socket-Nachrichten empfangen: 0 
 Signale d elivered: 0 
 Seitengröße (Bytes): 4096 
 Exit-Status: 0 
365

(Dies ist eine bereits beantwortete, alte Frage .. aber nur für die Aufzeichnung :)

Ich wurde von Yangs Drehbuch inspiriert und fand dieses kleine Tool namens memusg . Ich habe die Abtastrate einfach auf 0,1 erhöht, um sehr kurze Lebensprozesse 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.) Derzeit funktioniert es unter Mac OS X und Linux. Die Verwendung musste der von time ähnlich sein:

 memusg ls -alR />/dev/null 

Es zeigt nur die Spitze für den Moment, 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 ernsthafte Profile erstellen.

94
netj

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

61
jbeard4

Vielleicht (gnu) time (1) macht schon was du willst. Zum Beispiel:

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

Andere Profilerstellungstools liefern jedoch möglicherweise genauere Ergebnisse, je nachdem, was Sie suchen.

30
Jon Ericson

nter Linux:

Verwenden /usr/bin/time -v <program> <args> und suchen Sie nach " Maximum resident set size ".

(Nicht zu verwechseln mit dem eingebauten Befehl Bash time! Verwenden Sie also vollständiger Pfad, /usr/bin/time)

Zum Beispiel:

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

nter BSD, MacOS:

Verwenden /usr/bin/time -l <program> <args>, auf der Suche nach " maximale Größe der residenten Gruppe ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .
18
rustyx

/ usr/bin/time macht vielleicht tatsächlich das, was Sie wollen. So etwas wie.

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

Siehe Zeit (1) für Details ...

18
simon

Wenn der Prozess für mindestens ein paar Sekunden 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 bestimmen (ersetzen Sie rss jedes andere Attribut, das Sie interessiert im). Es ist etwas leichtgewichtig und funktioniert für mich mit dem in Ubuntu 9.04 enthaltenen ps (was ich für time nicht sagen kann).

#!/usr/bin/env bash
"[email protected]" & # 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
16
Yang

Unter MacOS Sierra verwenden Sie:

/usr/bin/time -l commandToMeasure

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

15
gsamaras

Nun, wenn Sie wirklich den Speicherpeak und einige detailliertere Statistiken anzeigen möchten, empfehle ich die Verwendung eines Profilers wie valgrind . Ein Nice-Valgrind-Frontend ist alleyoop .

8
alexn
time -f '%M' <run_program>
7
Jason

Sie können ein Tool wie Valgrind verwenden, um dies zu tun.

5
Dana the Sane

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
5
static_rtti

Heaptrack ist ein KDE-Tool mit einer GUI und einer Textschnittstelle. Ich finde es geeigneter als valgrind, die Speichernutzung eines Prozesses zu verstehen, da er mehr Details und Flammengraphen liefert. Es ist auch schneller, weil es das Schleifen weniger prüft. Und es gibt Ihnen die maximale Speichernutzung.

Jedenfalls ist das Verfolgen von RSS und VSS irreführend, da Seiten gemeinsam genutzt werden können. Deshalb memusg. Was Sie wirklich tun sollten, ist die Summe von Pss in /proc/[pid]/smaps oder pmap verwenden. GNOME-Systemmonitor war zu teuer.

1
Benoît

Das Rad neu erfinden, mit handgemachtem Bash-Skript. Schnell und sauber.

Mein Anwendungsfall: Ich wollte einen Linux-Rechner überwachen, der weniger RAM hat RAM) und wollte eine Momentaufnahme der Nutzung pro Container machen, wenn er unter starker Auslastung läuft.

#!/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: Free Memory Monitor mit einem Schwellenwert von 30% wird ausgeführt.

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 Speicherplatz 18.9387% ist weniger als 30%

ihre benutzerdefinierte Befehlsausgabe

1
147.3k
1
Hans W

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

1

'htop' ist der beste Befehl, um zu sehen, welcher Prozess wie viel RAM verbraucht .....

für weitere Informationen http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

0
Sanket