Invocar e rastrear o uso da memória de um processo

14

Quero executar um programa que consome memória e acompanhar seu uso de memória ao longo do tempo. O programa termina em alguns segundos após a chamada.

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

  • Ele aceita um intervalo mínimo de 1s, mas quero medir com granularidade mais curta. ( 0.1sdeve ficar bem)
  • Ele rastreia apenas um processo existente, embora nem sempre esteja presente para copiar e colar o pid.

Existem scripts / utilitários alternativos para executar melhor o trabalho de invocar e medir?

Jokester
fonte
1
Parece que você deve escrever um pequeno script Python ou Bash simples para despejar o uso de memória do processo (você pode ver apenas o primeiro número inteiro /proc/$PID/statm) e depois dormir por 100ms e repetir. Por que você não pode simplesmente continuar jogando do PID associada statmatravés de cat, talvez usar algum regex para filtrar fora os valores extra / desnecessários, e apenas fazer um sleep 0.01? Alguns sistemas operacionais não permitem sleepvalores abaixo de segundos , portanto, nesse caso, você teria que seguir a rota Python (e usar a timebiblioteca interna do Python para dormir).
Breakthrough
há muitas maneiras
Munish

Respostas:

11

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

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

Você pode 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 haja apenas um único processo em execução com o nome especificado.
Terdon
fonte
@ björnen obrigado pela edição. Você está certo, eu entendi errado man, não sei por que sua edição foi rejeitada.
terdon
1

Depois de anos, descobri que o 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 instantâneo da memória. Isso pode prejudicar a precisão das estatísticas.

Jokester
fonte