Como registrar a memória e o uso da CPU de um aplicativo?

16

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

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

[atualizar]

O elegante script python de Stefano Palazzo e

Os valores de saída de uma linha de Michał são menores que os da topCPU e Mem. Você tem uma ideia do porquê?

saída superior:

 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
Framester
fonte
Infelizmente, ainda não posso comentar aqui, mas você pode encontrar este post de interesse, por que pspode diferir de top: stackoverflow.com/questions/131303/…
PM PM

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 o log no arquivo:

logpid $$ | tee /tmp/pid.log

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

Michał Šrajer
fonte
Simples e faz o trabalho!
rafaelbattesti 23/01
3

Se você está precisamente atrás das topestatísticas, pode executar topno modo em lote especificando o pid do processo que está buscando. Tomando o exemplo desta página ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) se você digitou

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

Você "teria a execução principal 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á enviada para um arquivo ". Incluindo -pvocê pode especificar pido processo que você procura. Obviamente, isso retornará mais do que apenas CPU e RAM, mas conterá esses campos. No meu caso, por exemplo, 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
PM
fonte
Esta página, embora não faça redirecionamentos para um arquivo, realiza algumas modificações mais sofisticadas, permitindo obter apenas a CPU impressa. Se alguém souber de uma boa maneira de redirecionar a saída para um arquivo e atualizá-la periodicamente, eu estaria interessado em saber. watchnão me parece ideal para isso: superuser.com/questions/281347/filtering-top-command-output
PM
2

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

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)

Você primeiro precisa descobrir a identificação do processo do programa que deseja monitorar e executar o script com o PID como argumento:

python log.py 3912

Ele imprimirá o uso da CPU e o uso de 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 posteriormente ( python log.py 9391 > firefox_log.txt) e importar os dados para uma planilha selecionando Tabcomo seu separador.

O programa fecha quando você pressiona Ctrl + C ou quando o processo é interrompido.

Stefano Palazzo
fonte
Caro Stefano, muito obrigado pelo seu script. Infelizmente, parece produzir resultados errados. Tens alguma ideia do porquê? Por favor, veja minha pergunta atualizada.
Framester
Na página man do ps man7.org/linux/man-pages/man1/ps.1.html , o ps gera o "tempo de CPU usado dividido pelo tempo em que o processo está em execução (taxa de computação / tempo real), expresso como uma porcentagem "- de modo a obter uma média do uso da CPU desde que começou
Nicolas Charles