Invoca e rastreia o uso de memória de um processo

14

Eu quero executar um programa que consome memória e rastrear seu uso de memória ao longo do tempo. O programa termina em poucos segundos após ser chamado.

Esta pergunta anterior sugeriu o pacote sysstat . Embora seu utilitário pidstat faça parcialmente o que eu quero, ele não atende às minhas necessidades:

  • Aceita um intervalo mínimo de 1s , mas quero medir com granularidade mais curta. ( 0.1s deve ficar bem)
  • Ele rastreia somente um processo existente, enquanto nem sempre posso estar presente para copiar e colar o pid.

Existem alguns scripts / utilitários alternativos para realizar melhor o trabalho de chamar e medir?

    
por Jokester 15.07.2013 / 15:32

2 respostas

11

Isso deve fazer o que você precisa. Obtém as informações de /proc/$PID/statm e imprime (de 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

O script:

#!/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 \}''
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Você pode então chamar o script, dando a ele um nome de processo como entrada. Por exemplo:

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

  • Isso pressupõe que há apenas um processo em execução único com o nome especificado.
por 15.07.2013 / 17:24
1

Depois de anos descobri que valgrind (também) tem uma ferramenta para isso:

# 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: o valgrind faz mais do que observar: ele precisa injetar algum código e tirar um instantâneo da memória. Isso pode prejudicar a precisão das estatísticas.

    
por 25.10.2017 / 09:51