
Gostaria de monitorar o uso de memória/CPU de um processo em tempo real. Semelhante, top
mas direcionado a apenas um processo, de preferência com algum tipo de gráfico histórico.
Responder1
No Linux, top
na 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):
registro ps
Os seguintes endereçosalgum tipo de gráfico histórico. Pitãopsrecord
pacote 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'
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-tk
explorador de gráficos baseado em Tkinter (pode ser necessário) que pode ser exportado:
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 epsutil
estatsd
cliente.procmon.py
fornece 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:
pilha de grafite e telégrafo
Em vez do script Python enviar as métricas para o Statsd,telegraf
(e procstat
plugin 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 sysstat
pacote) 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 ps
comando não retornará “sucesso” e o while
loop 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
....