it-swarm.com.de

Unix-Befehl, um festzustellen, wie viel RAM während der Programmlaufzeit verwendet wurde)?

Angenommen, ich führe ein Skript aus (z. B. in Python). Um herauszufinden, wie lange das Programm gedauert hat, würde man laufen

time python script1.py

Gibt es einen Befehl, der festhält, wie viel RAM verwendet wurde, als das Skript ausgeführt wurde? Um herauszufinden, wie viel RAM verfügbar ist), könnte man verwenden free, aber dieser Befehl passt nicht zur obigen Aufgabe.

37
ShanZhengYang

Der Befehl time (1) (möglicherweise müssen Sie ihn installieren - möglicherweise als time -Paket - sollte in /usr/bin/time Sein) akzeptiert viele Argumente, einschließlich a Formatzeichenfolge (mit -f oder --format), die (unter anderem) versteht

  %M     Maximum resident set size of the process during its lifetime,
          in Kbytes.

  %K     Average total (data+stack+text) memory use of the process, in
          Kbytes.

Verwechseln Sie den Befehl /usr/bin/time Nicht mit dem Befehl timebash builtin . Möglicherweise müssen Sie den vollständigen Dateipfad /usr/bin/time Eingeben (um Ihre Shell aufzufordern, den Befehl Befehl nicht den integrierten Befehl auszuführen) oder command time Oder \time Eingeben. (danke an Toby Speight & an Arrow für ihre Kommentare).

Sie könnten es also versuchen (RSS ist die residente Satzgröße )

/usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S .user=%U" python script1.py

Sie könnten es auch versuchen

/usr/bin/time --verbose  python script1.py

Du fragst:

wie viel RAM wurde verwendet, als das Skript ausgeführt wurde?

und dies zeigt ein Missverständnis von Ihrer Seite. Anwendungsprogramme, die unter Linux (oder einem modernen Multiprozess-Betriebssystem) ausgeführt werden, verwenden virtueller Speicher und jeden Prozess (einschließlich des python -Prozesses, auf dem Ihr Skript ausgeführt wird ) hat ein eigenes virtueller Adressraum . Ein Prozess wird nicht direkt ​​in physisch RAM ausgeführt, sondern verfügt über einen eigenen virtuellen Adressraum (und wird darin ausgeführt) und der Kernel implementiert den virtuellen Speicher durch ausgefeilte Demand-Paging unter Verwendung von Lazy Copy-on-Write Techniken und konfiguriert die MMU . Der RAM ist ein physisches Gerät und eine Ressource, die vom Kernel zur Implementierung des virtuellen Speichers verwendet und intern verwaltet werden (lesen Sie auch über den Seiten-Cache und ungefähr Thrashing ).

Möglicherweise möchten Sie mehrere Tage damit verbringen, mehr über Betriebssysteme zu erfahren. Ich empfehle das Lesen von Betriebssysteme: Drei einfache Teile , einem frei herunterladbaren Buch. Das RAM wird vom gesamten Betriebssystem verwendet (nicht direkt von einzelnen Prozessen) und die tatsächlichen Seiten in RAM für einen bestimmten Prozess können im Laufe der Zeit variieren (und könnte irgendwie mit anderen Prozessen geteilt werden). Daher ist der RAM-Verbrauch eines bestimmten Prozesses nicht genau definiert, da er sich ständig ändert (Sie möchten möglicherweise seinen Durchschnitt oder seinen Spitzenwert usw. ...) und ebenfalls für die Größe seines virtuellen Adressraums.

Sie können auch das Dienstprogramm top (1) (möglicherweise in einem anderen Terminal) oder ps (1) oder - verwenden (insbesondere, wenn Ihr Skript mehrere Sekunden lang ausgeführt wird) pmap (1) - Möglicherweise wird watch (1) verwendet, um den Befehl ps oder pmap zu wiederholen. Sie können sogar direkt /proc/ (Siehe proc (5) ...) verwenden, vielleicht als watch cat /proc/$(pidof python)/status oder /proc/$(pidof python)/stat oder /proc/$(pidof python)/maps usw...

Aber RAM-Nutzung (vom Kernel für einen bestimmten Prozess) variiert stark mit der Zeit für eine bestimmte Zeit Prozess (und sogar sein virtueller Adressraum ändert sich, z. B. durch Aufrufe von mmap (2) und munmap, die von ld-linux (8) , - verwendet werden dlopen (3) , malloc (3) & free und viele andere Funktionen, die für Ihren Python Interpreter ...) benötigt werden. ).

Sie können auch strace (1) verwenden, um die Systemaufrufe zu verstehen, die von Python für Ihr Skript) ausgeführt werden (damit Sie verstehen, wie es verwendet wird mmap & munmap und andere syscalls (2) ). Sie können strace mit -e trace=%memory oder -e trace=memory, um nur speicherbezogene Systemaufrufe (dh virtuelle Systemräume) abzurufen.

Übrigens könnte auch die Funktion tracemalloc Python) nützlich sein.

Ich denke, dass Sie nur sich um virtuelle Speicher kümmern, das geht um virtuellen Adressraum (aber nicht über RAM), wird vom Python - Interpreter verwendet, um Ihr Python - Skript auszuführen. Und das ändert sich während der Ausführung des Prozesses. Der RSS (oder der maximale Peak) Größe des virtuellen Adressraums) könnte tatsächlich nützlicher zu wissen sein.

Siehe auch LinuxAteMyRAM .

52

Sie können auch das legendäre valgrind verwenden, obwohl Sie es möglicherweise von Ihrem Paketmanager installieren müssen.

$ valgrind c-projects/objtest/bin/objtest 
==6543== Memcheck, a memory error detector
==6543== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6543== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==6543== Command: c-projects/objtest/bin/objtest
==6543== 
|ERROR|array:189: array_delete: delete index 0 but the highest is -1 (delete from empty array): index out of bounds
==6543== 
==6543== HEAP SUMMARY:
==6543==     in use at exit: 480 bytes in 20 blocks
==6543==   total heap usage: 7,390 allocs, 7,370 frees, 256,217 bytes allocated
==6543== 
==6543== LEAK SUMMARY:
==6543==    definitely lost: 96 bytes in 4 blocks
==6543==    indirectly lost: 384 bytes in 16 blocks
==6543==      possibly lost: 0 bytes in 0 blocks
==6543==    still reachable: 0 bytes in 0 blocks
==6543==         suppressed: 0 bytes in 0 blocks
==6543== Rerun with --leak-check=full to see details of leaked memory
==6543== 
==6543== For counts of detected and suppressed errors, rerun with: -v
==6543== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Wenn Sie ein Power-User sind und ausgefallene Grafiken wünschen, können Sie ms_print Und einen Befehl wie den folgenden verwenden:

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

siehe maximale Speichernutzung eines Linux/Unix-Prozesses .

17
cat

Mit dem Befehl pmap können Sie die von einem Prozess verwendete Speichermenge anzeigen. In Ihrem Fall müssen Sie die PID des Skripts als Eingabe für den Befehl pmap wie angeben

pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')

2
upkar