Rufen Sie die Speichernutzung eines Prozesses auf und verfolgen Sie sie

14

Ich möchte ein speicherintensives Programm ausführen und dessen Speichernutzung über einen längeren Zeitraum verfolgen. Das Programm endet wenige Sekunden nach dem Aufruf.

Diese vorherige Frage schlug das sysstat- Paket vor. Während sein pidstatDienstprogramm teilweise das tut, was ich will, kann es meine 2 Bedürfnisse nicht erfüllen:

  • Es akzeptiert einen minimalen Intervall von 1s, aber ich möchte mit einer kürzeren Granularität messen. ( 0.1sSollte in Ordnung sein)
  • Es wird nur ein vorhandener Prozess verfolgt, während ich nicht immer anwesend sein kann, um die PID zu kopieren und einzufügen.

Gibt es einige alternative Skripte / Dienstprogramme, um die Aufruffunktion zu verbessern?

Jokester
quelle
1
Klingt so, als ob Sie sich ein einfaches kleines Python- oder Bash-Skript schreiben sollten, um die Speichernutzung des Prozesses zu ermitteln (Sie können nur die erste Ganzzahl in /proc/$PID/statmanzeigen), und dann 100 ms schlafen und wiederholen. Warum kann man einfach nicht hält die PIDs zugeordnet werfen statmdurch cat, vielleicht einige regex von den extra / nicht benötigten Werten Filter verwenden, und nur tun sleep 0.01? Einige Betriebssysteme erlauben keine sleepWerte unter einer Sekunde. In diesem Fall müssten Sie die Python-Route timeeinschlagen (und stattdessen die integrierte Bibliothek von Python verwenden, um in den Ruhezustand zu wechseln).
Durchbruch
es gibt viele Möglichkeiten
Munish

Antworten:

11

Dies sollte tun, was Sie brauchen. Es erhält die Informationen von /proc/$PID/statmund druckt (von man procfs):

              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 Drehbuch:

#!/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 '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Anschließend können Sie das Skript aufrufen und ihm als Eingabe einen Prozessnamen geben. Beispielsweise:

$ 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 einziger Prozess mit dem angegebenen Namen ausgeführt wird.
terdon
quelle
@björnen danke für die bearbeitung. Sie haben völlig recht, ich hatte das Unrecht man, ich weiß nicht, warum Ihre Bearbeitung abgelehnt wurde.
Terdon
1

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 kann mehr als nur beobachten: Es muss Code injiziert und eine Momentaufnahme des Speichers erstellt werden. Dies kann die Genauigkeit der Statistiken beeinträchtigen.

Jokester
quelle