Como logar a memória e o uso de cpu de uma aplicação?

16

Semelhante à pergunta Como registrar a carga da CPU? , eu gostaria de logar memória de um processo.

O processo que eu quero registrar, é morto em um servidor remoto, e eu quero descobrir a carga da CPU e o uso de memória antes de ser morto.

[atualização]

Tanto o pequeno e puro roteiro python de Stefano Palazzo quanto

Valores de saída de uma linha de Michał que são menores que em top para CPU e Mem. Você tem uma ideia do porquê?

output top:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

saída do script python de Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20
    
por Framester 08.08.2011 / 11:19

3 respostas

16

Você pode criar uma linha no shell:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

para registrar o processo com pid = 123 apenas:

logpid 123

ou para ver e gravar log em arquivo:

logpid $$ | tee /tmp/pid.log

Se você deseja que outros dados sejam registrados, modifique as opções -o {this} . Consulte a seção man ps "ESPECIFICADORES DE FORMATO PADRÃO" para obter os parâmetros disponíveis. Se você quiser uma resolução de tempo diferente, altere sleep {this} na função logpid() .

    
por Michał Šrajer 08.08.2011 / 14:50
3

Se você estiver precisamente após as estatísticas top , poderá executar top no modo em lote, especificando o pid do processo que você está procurando. Tomando o exemplo desta página ( link ) se você digitou

top -b -d 10 -n 3 >> top-file

Você teria "top executando no modo de lote (-b). Ele será atualizado a cada 10 segundos, conforme especificado pelo sinalizador de atraso (-d), para uma contagem total de 3 iterações (-n). A saída será enviado para um arquivo ". Incluindo -p você pode especificar o pid do processo que você está procurando. Isto, naturalmente, retornará mais do que puramente cpu e ram, mas conterá esses campos. No meu caso, por exemplo, eu obteria o seguinte ao monitorar o pid 9189 usando top -b -d 10 -n 3 -p 9189 >> ~/top-file :

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit
    
por P-M 04.07.2016 / 16:45
2

Este script python simples deve fazer o que você quer:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Primeiro você precisa descobrir o ID do processo que deseja monitorar, então você pode executar o script com o PID como um argumento:

python log.py 3912

Ele imprimirá o uso da CPU e o uso da memória RAM em porcentagem duas vezes por segundo:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Você pode redirecionar sua saída para um arquivo para importá-lo para uma planilha posterior ( python log.py 9391 > firefox_log.txt ) e importar os dados para uma planilha selecionando Tab como seu separador.

O programa é encerrado quando você pressiona Ctrl + C ou quando o processo é eliminado.

    
por Stefano Palazzo 08.08.2011 / 12:20