Richiama e traccia l'utilizzo della memoria di un processo


14

Voglio eseguire un programma che consuma memoria e tenere traccia del suo utilizzo della memoria nel tempo. Il programma termina dopo pochi secondi dopo essere stato richiamato.

Questa domanda precedente suggeriva il pacchetto sysstat . Mentre la sua pidstatutilità fa in parte ciò che voglio, non riesce a soddisfare le mie 2 esigenze:

  • Accetta un intervallo minimo di 1s, ma voglio misurare con una granularità più breve. ( 0.1sdovrebbe andare bene)
  • Tiene traccia solo di un processo esistente, mentre non posso sempre essere presente per copiare e incollare il pid.

Ci sono alcuni script / utilità alternativi per fare meglio il lavoro di invocazione e misura?


1
Sembra che dovresti scrivere un semplice piccolo script Python o Bash per scaricare l'utilizzo della memoria del processo (puoi solo visualizzare il primo numero intero in /proc/$PID/statm), quindi dormire per 100ms e ripetere. Perché non si può solo continuare a lanciare il PID associato statmattraverso cat, forse utilizzare alcuni regex per filtrare fuori i valori supplementari / non necessari, e basta fare un sleep 0.01? Alcuni sistemi operativi non consentiranno sleepvalori inferiori al secondo , quindi in quel caso dovresti prendere la route Python (e invece utilizzare la timelibreria integrata di Python per dormire).
Sfondamento

ci sono molti modi
munish

Risposte:


11

Questo dovrebbe fare quello che ti serve. Ottiene le informazioni /proc/$PID/statme stampa (da 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

Il copione:

#!/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

È quindi possibile chiamare lo script, assegnandogli un nome di processo come input. Per esempio:

$ 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

APPUNTI:

  • Ciò presuppone che esista un solo processo in esecuzione con il nome specificato.

@ björnen grazie per la modifica. Hai ragione, ho sbagliato manlì, non so perché la tua modifica sia stata respinta.
terdon,

1

Dopo anni ho scoperto che valgrind (anche) ha uno strumento per questo:

# 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

Nota: valgrind fa molto più che osservare: deve iniettare un po 'di codice e scattare un'istantanea della memoria. Ciò potrebbe danneggiare la precisione delle statistiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.