Aufrufen und Verfolgen der Speichernutzung eines Prozesses

10297
Jokester

Ich möchte ein speicherintensives Programm ausführen und die Speicherbelegung im Lauf der Zeit verfolgen. Das Programm endet einige Sekunden nach dem Aufruf.

Diese vorige Frage schlug das sysstat- Paket vor. Während sein pidstatNutzen teilweise tut, was ich will, erfüllt es meine zwei Bedürfnisse nicht:

  • Es akzeptiert ein minimales Intervall von 1s, aber ich möchte mit einer kürzeren Granularität messen. ( 0.1ssollte gut sein)
  • Es verfolgt nur einen vorhandenen Prozess, während ich beim Kopieren und Einfügen der PID nicht immer anwesend sein kann.

Gibt es alternative Skripte / Hilfsprogramme, um die Aufgabe zum Abrufen und Messen besser auszuführen?

14
Klingt, als müssten Sie sich ein einfaches kleines Python- oder Bash-Skript schreiben, um die Speicherauslastung des Prozesses zu sichern (Sie können nur die erste Ganzzahl in `/ proc / $ PID / statm` anzeigen) und dann 100 ms lang schlafen und wiederholen. Warum können Sie nicht einfach weiterhin die mit "statm" verbundenen PIDs durch "cat" werfen, vielleicht etwas Regex verwenden, um die zusätzlichen / nicht benötigten Werte herauszufiltern, und einfach einen "sleep 0.01" machen? Einige Betriebssysteme lassen keine "sleep" -Werte im Sekundentakt zu. In diesem Fall müssten Sie die Python-Route (und stattdessen die eingebaute "time" -Bibliothek von Python verwenden, um in den Ruhezustand zu wechseln). Breakthrough vor 10 Jahren 1
es gibt viele [Möglichkeiten] (http://www.golinuxhub.com/2015/02/wie-nach-check-memory-verwertung-für.html) munish vor 8 Jahren 0

2 Antworten auf die Frage

11
terdon

Das sollte tun, was Sie brauchen. Es holt die Informationen von /proc/$PID/statmund druckt (von man stat):

 size total program size (same as VmSize in /proc/[pid]/status) resident resident set size (same as VmRSS in /proc/[pid]/status) share shared pages (from shared mappings) data data + stack 

Das Skript:

#!/usr/bin/env bash   ## Print header echo -e "Size\tResid.\tShared\tData\t%" while [ 1 ]; do ## Get the PID of the process name given as argument 1 pidno=`pgrep $1` ## If the process is running, print the memory usage if [ -e /proc/$pidno/statm ]; then ## Get the memory info m=`awk '' /proc/$pidno/statm` ## Get the memory percentage perc=`top -bd .10 -p $pidno -n 1 | grep $pidno | gawk ''` ## print the results echo -e "$m\t$perc"; ## If the process is not running else echo "$1 is not running"; fi done 

Sie können das Skript dann aufrufen und ihm einen Prozessnamen als Eingabe geben. Zum Beispiel:

$ memusage.sh firefox Size Resid. Shared Data % 517193 261902 9546 400715 12.8 517193 261902 9546 400715 12.8 517193 261902 9546 400715 12.8 517193 262100 9546 400715 12.8 517193 262100 9546 400715 12.8 517193 262100 9546 400715 12.8 517209 261899 9546 400731 12.8 517209 261899 9546 400731 12.8 

ANMERKUNGEN:

  • Dies setzt voraus, dass nur ein einzelner Prozess mit dem angegebenen Namen ausgeführt wird.
1
Jokester

Nach Jahren habe ich festgestellt, dass valgrind (auch) ein Werkzeug dafür hat:

# record memory usage  $ valgrind --tool=massif bash -c "sleep 5; echo hey"; ==5281== Massif, a heap profiler ==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote ==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info ==5281== Command: bash -c sleep\ 5;\ echo\ hey ==5281== hey ==5281==  # print the usage (5281 was the pid of bash, your filename will be different) $ ms_print massif.out.4682 

Hinweis: valgrind tut mehr als nur zu beobachten: Es muss etwas Code eingefügt und eine Momentaufnahme des Speichers erstellt werden. Dies kann die Genauigkeit der Statistiken beeinträchtigen.