Invocar y rastrear el uso de memoria de un proceso

14

Quiero ejecutar un programa que consuma memoria y rastrear su uso de memoria con el tiempo. El programa termina en unos segundos después de invocado.

Esta pregunta anterior sugirió el paquete sysstat . Si bien su pidstatutilidad en parte hace lo que quiero, no cumple con mis 2 necesidades:

  • Acepta un intervalo mínimo de 1s, pero quiero medir con una granularidad más corta. ( 0.1sdebería estar bien)
  • Solo rastrea un proceso existente, mientras que no siempre puedo estar presente para copiar y pegar el pid.

¿Hay algunos scripts / utilidades alternativas para mejorar el trabajo de invocar y medir?

Bromista
fuente
1
Parece que debería escribir un pequeño script simple de Python o Bash para volcar el uso de memoria del proceso (puede ver el primer entero /proc/$PID/statm), y luego dormir durante 100 ms y repetir. ¿Por qué no puedes seguir tirando del PID asociado statma través de cat, tal vez utilizar algunas expresiones regulares para filtrar fuera de los valores extra / innecesarios, y acaba de hacer una sleep 0.01? Algunos sistemas operativos no permiten sleepvalores de menos de un segundo , por lo que en ese caso, tendría que tomar la ruta de Python (y usar la timebiblioteca incorporada de Python para dormir).
Avance el
hay muchas maneras
munish

Respuestas:

11

Esto debería hacer lo que necesitas. Obtiene la información /proc/$PID/statme imprime (desde 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

La secuencia de comandos:

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

Luego puede llamar al script, dándole un nombre de proceso como entrada. Por ejemplo:

$ 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

NOTAS

  • Esto supone que solo hay un único proceso en ejecución con el nombre especificado.
terdon
fuente
@ björnen gracias por la edición. Tienes toda la razón, me equivoqué manallí, no sé por qué se rechazó tu edición.
terdon
1

Después de años descubrí que valgrind (también) tiene una herramienta para esto:

# 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 hace más que observar: necesita inyectar algo de código y tomar una instantánea de la memoria. Esto puede dañar la precisión de las estadísticas.

Bromista
fuente