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

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().


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.