So messen Sie unter Linux den Spitzenspeicher einer Anwendung nach dem Ende

11

Wie messe ich den Spitzenspeicher einer Anwendung, die unter Linux ausgeführt wird?

Ich führe diese App im Batch aus, daher kann ich RSS nicht verwenden, da sie den aktuellen Speicher meldet. Ich benötige den Spitzenspeicher, den die Anwendung verwendet hat, um am Ende gemeldet zu werden.

Der VmPeak ist ebenfalls keine Lösung, da er den zugewiesenen Speicher meldet und auch nicht vom realen RAM, sondern auch von der Festplatte berechnet.

des_user
quelle
Auf welchem ​​Betriebssystem führen Sie die Anwendung aus?
Ein Lebenslauf
Ich arbeite an Linux
des_user
Dieser Thread sollte Ihnen helfen: serverfault.com/questions/387268/…
Jacob Coleman

Antworten:

13

Hier sind zwei Methoden zum Verfolgen der maximalen Speichernutzung eines Prozesses.

Sirup

Ich habe dieses Tool nicht verwendet, aber es klingt wie das, wonach Sie suchen. Es heißt Sirup .

Beschreibung

Syrupy ist ein Python-Skript, das regelmäßig Snapshots des Speichers und der CPU-Auslastung eines oder mehrerer laufender Prozesse erstellt, um dynamisch ein Profil der Verwendung von Systemressourcen zu erstellen.

Beispiel

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Ja, ironischerweise kann der Befehl GNU time Ihnen die maximale Speichernutzung eines Prozesses anzeigen. Es meldet den Spitzenspeicher wie folgt : Maximum resident set size (kbytes).

Beispiel

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    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): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Verweise

slm
quelle
3

Obwohl das Thema ziemlich alt ist, möchte ich ein anderes Projekt teilen, das aus der Linux-Kernelfunktion von cgroups hervorgegangen ist.

https://github.com/gsauthof/cgmemtime :

cgmemtime misst die RSS + CACHE-Speichernutzung eines Prozesses und seiner untergeordneten Prozesse.

Dazu wird der Prozess in eine eigene Gruppe eingeteilt.

Zum Beispiel weist Prozess A 10 MiB zu und teilt ein Kind B auf, das 20 MiB zuweist, und das ein Kind C teilt, das 30 MiB zuweist. Alle drei Prozesse teilen sich ein Zeitfenster, in dem ihre Zuordnungen zu einer entsprechenden RSS-Speichernutzung (Resident Set Size) führen.

Die Frage ist nun: Wie viel Speicher wird tatsächlich durch Ausführen von A verwendet?

Antwort: 60 MiB

cgmemtime ist das Werkzeug, um solche Fragen zu beantworten.

Anwendungsbeispiele wären:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB
Vlad Frolov
quelle
Wie kann dieses Tool verwendet werden, um die maximale RAM-Auslastung eines Programms nach dem Beenden dieses Programms zu melden ?
Terdon
@terdon Wird verwendet wait4, um den Prozessausgang in einer Kombination mit cgroups ( memory.max_usage_in_bytes) abzufangen , was sinnvoll erscheint. Weitere Details finden Sie in der README-Datei auf github.
Vlad Frolov
Danke, aber mein Punkt war mehr über Ihre Antwort. Derzeit wird die Frage nicht beantwortet, sondern nur auf eine externe Ressource verwiesen, die dies möglicherweise kann. Außerdem haben Sie genau dieselbe Antwort an anderer Stelle veröffentlicht, wodurch eine automatische Flagge ausgelöst wird. Bitte bearbeiten Sie Ihre Antwort und fügen Sie ein Beispiel bei, das zeigt, wie dieses Programm das tun kann, was das OP verlangt.
Terdon
2
@terdon Ja, ich habe! Weil ich nach der gleichen Frage gesucht habe und die Fragen ziemlich gleich sind und die Antworten alle gleich sind: 'parse ps output', was verrückt ist! Ich habe eine Woche zuvor versehentlich auf das cgmemtime-Projekt gestoßen, das perfekt zu all den Fragen passt, die ich kommentiert habe!
Vlad Frolov
1
Meinetwegen. Es wäre einfach großartig, wenn Sie ein Beispiel geben könnten, wie es verwendet werden könnte. Es würde Ihre Antwort verbessern. Auf jeden Fall, danke, dass Sie sich die Zeit genommen haben, dies zu posten, ich bin sicher, dass andere es nützlich finden werden.
Terdon