Messung der RAM-Auslastung eines Programms

46

time ist ein brillanter Befehl, wenn Sie herausfinden möchten, wie viel CPU-Zeit ein bestimmter Befehl benötigt.

Ich suche nach etwas ähnlichem, das die maximale RAM-Auslastung des Programms und aller möglicher Kinder messen kann. Vorzugsweise sollte zwischen belegtem und nicht belegtem Speicher unterschieden werden. Vielleicht könnte es sogar die mittlere Speichernutzung geben (also die Speichernutzung, die Sie erwarten sollten, wenn Sie für eine lange Zeit ausgeführt werden).

Also würde ich gerne machen:

rammeassure my_program my_args

und erhalte eine Ausgabe ähnlich der folgenden:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

Ich habe mir memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 angesehen, aber ich betrachte das als etwas Hack.

Ole Tange
quelle

Antworten:

24

Mit tstime können Sie die Hochwasserspeicherauslastung (RSS und virtuell) eines Prozesses messen.

Zum Beispiel:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

Es unterstützt auch einen einfacher zu analysierenden Ausgabemodus ( -t).

maxschlepzig
quelle
Ich mag das. Es hat sogar das Richtige getan mit./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange
3
"RAM-Nutzung durch den Prozess" ist kein genau definierter Wert: Wenn mehrere Instanzen desselben Programms ausgeführt werden, teilen sie sich die ausführbare Datei. Die meisten Programme teilen sich glibc(und andere sortierte Bibliotheken, sie werden für etwas "geteilt" genannt). Viele Daemons laden die Konfiguration in den Arbeitsspeicher und forken (2) untergeordnete Elemente, die dann die Konfigurationsdaten gemeinsam nutzen. Dann gibt es Daten in Readahead / Writebehind-Puffern, die vom Kernel verwaltet werden. Und dann gibt es Services, die eine Herde lose gekoppelter Prozesse sind (denken Sie an Ihre Desktop-Umgebung und all ihre Applets und Hintergrundinformationen).
Vonbrand
@vonbrand, wie der Linux-Kernel die RSS / VSS-Werte berechnet, ist genau definiert.
Maxschlepzig
@maxschlepzig, es kann durchaus sein, dass zufällige Werte berechnet werden, die nicht bedeuten, was Sie denken, dass sie bedeuten: Die residente Menge sind nur die Seiten im Adressraum des Prozesses, die sich derzeit im Speicher befinden. Dies ist nicht der "von diesem Prozess verwendete Speicher", sondern umfasst alles, was er gemeinsam nutzt.
Vonbrand
@vonbrand Die meisten Anwendungsfälle zum Messen der Speichernutzung eines Prozesses möchten nicht gemeinsam genutzte anonyme Seiten messen, die mit derselben Eingabe sehr vorhersehbar sein sollten.
Vladimir Panteleev
28

timeist ein in deine Shell eingebautes. Wenn Sie möchten, timeaber weitere Informationen benötigen, probieren Sie GNU timeim verbose ( -v) -Modus aus:

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

Suchen Sie das Paket "time" oder "gnutime" in Ihrem Paketmanager.

Rufo El Magufo
quelle
3
Beachten Sie, dass einige von GNU gemeldete Informationen ungenau sein können. ZB unter Ubuntu 10.04: Auf der Manpage steht 'Die Zahlen sind nur so gut wie die von wait3 (2) zurückgegebenen'. Dh wait3füllt eine Struktur aus, die beschrieben wird in getrusage(2): 'Nicht alle Felder sind unter Linux aussagekräftig. [..] '.
Maxschlepzig
4
Zum Beispiel in einem Testprogramm, das 10 MB genau zuweist (und jede Seite berührt) - die GNU-Zeit meldet einen maxRSS von 42608 KiB - und tstimemeldet 10652 KiB. Wieder unter Ubuntu 10.04.
Maxschlepzig
Ich hätte es geliebt, wenn es so einfach gewesen wäre. Auf meinem Ubuntu - Rechner habe ich versucht: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top sagt, es dauert ungefähr 570 MB, aber die Zeit sagt 2,3 GB. In der Praxis ist diese Nummer für mich nicht verwendbar.
Ole Tange
Der Faktor 4 ist in der GNU-Zeit 1.7 festgelegt und funktioniert somit wie erwartet.
Ole Tange
Wichtiger Hinweis: Die "Maximum Resident Set Size" funktioniert nur seit Linux 2.6.32.
Jan Hudec
17

Vielleicht übertrieben, aber ich habe gerade herausgefunden, dass valgrindes ein nettes Tool namens gibt massif. Ich habe es getestet auf xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

Und Sie erhalten ein schönes Speicherauslastungsdiagramm:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

zusammen mit übermäßig detaillierten Informationen zur Speichernutzung. Details im valgrind Handbuch .

Die Programme werden jedoch ca. 20x langsamer ausgeführt. Außerdem habe ich einige Befehle in der ausgeführt xterm. Ihr Speicherbedarf wurde berücksichtigt, da --trace-children=yesdie Option vorhanden ist!

Stéphane Gimenez
quelle
1
Die 20-fache Geschwindigkeitsstrafe macht es für meine Situation unbrauchbar. Ansonsten sehr schöne Grafik!
Ole Tange
1
Zumindest in der von mir verwendeten Version 3.8.1 von valgrind werden Boolesche Werte nur in der Form "ja / nein" und nicht "wahr / falsch" akzeptiert. Meins hat sich beschwert! :-)
MakisH
6

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.

Zu diesem Zweck wird der Prozess in eine eigene C-Gruppe eingeordnet.

Beispiel: Prozess A weist 10 MiB zu und gabelt einem Kind B, das 20 MiB zuweist, und einem Kind C, 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 verwendet, wenn A ausgeführt wird?

Antwort: 60 MiB

cgmemtime ist das Werkzeug, um solche Fragen zu beantworten.

Vlad Frolov
quelle
3

Sieht so aus, als würde tstime unter Nicht-Root-Betriebssystemen unter Linux> = 3.0 nicht mehr funktionieren. Hier ist ein Polling-Dienstprogramm, das ich geschrieben habe, um das Problem zu umgehen: https://github.com/jhclark/memusg/blob/master/memusg

jhclark
quelle
/usr/bin/time -vgibt die korrekte Ausgabe in neueren Versionen. In älteren Versionen müssen Sie nur durch 4 teilen, um die richtige Menge zu erhalten.
Ole Tange
Ich glaube jedoch nicht, dass time -v die maximale Speichergröße unterstützt (nur RSS). Kann jemand dies auf der neuesten Version bestätigen?
Jhclark