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

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

Semelhante à perguntaComo registrar a carga da CPU?, gostaria de registrar a memória de um processo.

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

[atualizar]

Tanto o pequeno script python de Stefano Palazzo quanto

Os valores de saída de uma linha de Michał são menores do que em 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 

produza o script python de Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Responder1

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

Responder2

Se você está precisamente atrás das topestatísticas, você pode executar topem modo lote especificando o pid do processo que você está procurando. 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 superior no modo em 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." Inclusive -pvocê pode especificar o pidprocesso que deseja. É claro que isso retornará mais do que apenas 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

Responder3

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)

Primeiro você precisa descobrir o ID do processo do programa que deseja monitorar e, em seguida, executar o script com o PID como 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 então redirecionar sua saída para um arquivo para importá-lo posteriormente para uma planilha ( python log.py 9391 > firefox_log.txt) e importar os dados para uma planilha selecionando Tabcomo separador.

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

Responder4

Procpathpode ser usado para registrar métricas Procfs de um aplicativo (árvores de processos), incluindo uso de CPU e tamanho do conjunto residente (RSS). Divulgação completa: eu escrevi.

Tomemos o Firefox como exemplo. Na minha máquina, sua árvore de processos é assim:

 /usr/lib/firefox/firefox
 ├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 └─ /usr/lib/firefox/firefox -contentproc -childID 8 ... 

Com o Procpath você pode coletar métricas de processo desta árvore como a seguir (e vera documentaçãose quiser perguntar ao supervisor de processo da sua aplicação, digamos systemd ou Docker, o PID raiz):

procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'

Com este comando, o Procpath irá coletar e registrar as métricas Procfs desta árvore uma vez a cada 10 segundos. Você pode deixá-lo rodando em um multiplexador de terminal (como o Byobu) para executá-lo em segundo plano no seu servidor.

Quando seu aplicativo travar novamente, você poderá usar este comando para visualizar o uso da CPU e o tamanho do conjunto residente do aplicativo.

procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer

Gráfico CPU vs RSS

informação relacionada