Procpath

Procpath

Gostaria de monitorar o uso de memória/CPU de um processo em tempo real. Semelhante, topmas direcionado a apenas um processo, de preferência com algum tipo de gráfico histórico.

Responder1

No Linux, topna verdade, suporta o foco em um único processo, embora naturalmente não tenha um gráfico de histórico:

top -p PID

Também está disponível no Mac OS X com uma sintaxe diferente:

top -pid PID

Responder2

Procpath

Atualização de 2020 (somente Linux/procfs). Voltando ao problema da análise de processos com bastante frequência e não estando satisfeito com as soluções que descrevi originalmente abaixo, decidi escrevermeu próprio. É um pacote CLI puro do Python, incluindo algumas dependências (sem Matplotlib pesado), pode potencialmente traçar muitas métricas de procfs, consultas JSONPath para a árvore de processos, tem dizimação/agregação básica (Ramer-Douglas-Peucker e média móvel), filtragem por intervalos de tempo e PIDs e algumas outras coisas.

pip3 install --user procpath

Aqui está um exemplo com o Firefox. Isso registra todos os processos com "firefox" em seus cmdline(a consulta por um PID seria semelhante a '$..children[?(@.stat.pid == 42)]') 120 vezes, uma vez por segundo.

procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'

Plotar o uso de RSS e CPU de um único processo (ou vários) de todos os registrados seria semelhante a:

procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg

Os gráficos têm esta aparência (na verdade, são SVGs Pygal interativos):

RSS CPU

registro ps

Os seguintes endereçosalgum tipo de gráfico histórico. Pitãopsrecordpacote faz exatamente isso.

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

Para processo único é o seguinte (parado por Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

Para vários processos, o script a seguir é útil para sincronizar os gráficos:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

Os gráficos se parecem com: exemplo de registro ps

perfil_de_memória

Opacotefornece amostragem somente RSS (além de algumas opções específicas do Python). Ele também pode registrar processos com seus processos filhos (consulte Recursos mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

Por padrão, aparece um python-tkexplorador de gráficos baseado em Tkinter (pode ser necessário) que pode ser exportado:

mprof

pilha de grafite e estatísticas

Pode parecer um exagero para um teste simples e único, mas para algo como uma depuração de vários dias é, com certeza, razoável. Um prático multifuncionalraintank/graphite-stack(dos autores de Grafana) imagem epsutilestatsdcliente.procmon.pyfornece uma implementação.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

Então, em outro terminal, após iniciar o processo de destino:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

Então abrindo o Grafana em http://localhost:8080, autenticação como admin:admin, configurando a fonte de dados https://localhost, você pode traçar um gráfico como:

gráfico de grafana

pilha de grafite e telégrafo

Em vez do script Python enviar as métricas para o Statsd,telegraf(e procstatplugin de entrada) pode ser usado para enviar as métricas diretamente para o Graphite.

A configuração mínima telegrafé semelhante a:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Em seguida, execute linha telegraf --config minconf.conf. A parte do Grafana é a mesma, exceto os nomes das métricas.

pidstat

pidstat(parte do sysstatpacote) pode produzir resultados que podem ser facilmente analisados. É útil caso você precise de métricas extras do (s) processo (s), por exemplo, os 3 grupos mais úteis (CPU, memória e disco) contêm: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Eu descrevi isso emuma resposta relacionada.

Responder3

htopé um ótimo substituto para top. Tem… Cores! Atalhos de teclado simples! Role a lista usando as teclas de seta! Mate um processo sem sair e sem anotar o PID! Marque vários processos e elimine todos eles!

Entre todos os recursos, a página de manual diz que você pode pressionar Fparaseguirum processo.

Realmente, você deveria tentar htop. Nunca mais comecei top, depois da primeira vez que usei htop.

Exibir um único processo:

htop -p PID

Responder4

Estou um pouco atrasado aqui, mas compartilharei meu truque de linha de comando usando apenas o padrãops

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

Eu uso isso como uma linha única. Aqui a primeira linha dispara o comando e armazena o PID na variável. Então ps imprimirá o tempo decorrido, o PID, a porcentagem de utilização da CPU, a porcentagem de memória e a memória RSS. Você também pode adicionar outros campos.

Assim que o processo terminar, o pscomando não retornará “sucesso” e o whileloop terminará.

Você pode ignorar a primeira linha se o PID cujo perfil deseja criar já estiver em execução. Basta colocar o id desejado na variável.

Você obterá uma saída como esta:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....

informação relacionada