Gostaria de monitorar o uso de memória/CPU de um processo em tempo real. Semelhante a top
, mas direcionado a apenas um processo, de preferência com um gráfico de histórico de algum tipo.
No Linux, top
realmente suporta o foco em um único processo, embora naturalmente não tenha um gráfico de histórico:
top -p PID
Isso também está disponível no Mac OS X com uma sintaxe diferente:
top -pid PID
Os seguintes endereços gráfico histórico de algum tipo . Python psrecord
) o pacote faz exatamente isso.
pip install psrecord # local user install
Sudo apt-get install python-matplotlib python-tk # for plotting; or via pip
Para um processo único, é o seguinte (parado por Ctrl+C):
psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png
Para vários processos, o seguinte script é ú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 são parecidos com:
O pacote fornece amostra apenas de RSS (mais algumas opções específicas do Python). Ele também pode registrar processos com seus processos filhos (consulte mprof --help
).
pip install memory_profiler
mprof run /path/to/executable
mprof plot
Por padrão, isso exibe um arquivo baseado em Tkinter (python-tk
pode ser necessário) gráfico Explorer, que pode ser exportado:
Pode parecer um exagero para um teste pontual simples, mas para algo como uma depuração de vários dias é, com certeza, razoável. Um prático multifuncional raintank/graphite-stack
(dos autores da Grafana) imagem e psutil
e statsd
cliente. procmon.py
fornece uma implementação.
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
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.*'
Em seguida, abra o Grafana em http: // localhost: 808 , autenticação como admin:admin
, configurando fonte de dados https: // localhost , você pode plotar um gráfico como:
Em vez de Python enviando as métricas para Statsd, telegraf
(e procstat
plugin de entrada)) pode ser usado para enviar as métricas Grafite diretamente.
A configuração mínima de telegraf
se parece com:
[agent]
interval = "1s"
[[outputs.graphite]]
servers = ["localhost:2003"]
prefix = "testprfx"
[[inputs.procstat]]
pid_file = "/path/to/file/with.pid"
Em seguida, execute a linha telegraf --config minconf.conf
. A parte Grafana é a mesma, exceto os nomes das métricas.
pidstat
(parte do pacote sysstat
) pode produzir uma saída que pode ser facilmente analisada. É ú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 o descrevi em ma resposta relacionada .
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 tomar nota do PID! Marque vários processos e mate todos!
Entre todos os recursos, a página de manual diz que você pode pressionar F para seguir um processo.
Realmente, você deve tentar htop
. Nunca iniciei top
novamente, após a primeira vez que usei htop
.
Exiba um único processo:
htop -p PID
Para usar essas informações em um script, você pode fazer isso:
calcPercCpu.sh
#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
|grep $nPid \
|sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
|cut -d' ' -f9 \
|tr '\n' '+' \
|sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu
use como: calcPercCpu.sh 1234
onde 1234 é o pid
Para o $ nPid especificado, ele medirá o médio de 10 instantâneos do uso da CPU em um segundo inteiro (atraso de 0,1s cada * nTimes = 10); que fornece um resultado preciso bom e rápido do que está acontecendo no momento.
Ajuste as variáveis de acordo com suas necessidades.
Eu normalmente uso os dois seguintes:
HP caliper : é uma ferramenta muito boa para monitorar processos; você também pode verificar o gráfico de chamadas e outras informações de baixo nível. Mas observe que é gratuito apenas para uso pessoal.
daemontools : uma coleção de ferramentas para gerenciar serviços UNIX
Usando top
e awk
é possível criar facilmente, por exemplo um log separado por vírgula de% CPU ($9
) +% De MEM ($10
) uso que pode ser posteriormente alimentado em qualquer ferramenta de estatísticas e gráficos.
top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'
A saída será como
2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4
Isso não dará bons resultados para grandes $delay
, no entanto, porque o carimbo de data e hora impresso é realmente $delay
behind devido a como a saída de top
funciona. Sem entrar em muitos detalhes, uma maneira simples de contornar isso é registrar o tempo fornecido por top
:
top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'
O carimbo de data e hora é preciso, mas a saída ainda será atrasada por $delay
.
Se você souber o nome do processo, poderá usar
top -p $(pidof <process_name>)
Estou um pouco atrasado aqui, mas vou compartilhar meu truque de linha de comando usando apenas o padrão ps
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. Aqui a primeira linha dispara o comando e armazena o PID na variável Em seguida, o ps imprimirá o tempo decorrido, o PID, a porcentagem de CPU utilizada, a porcentagem de memória e a memória RSS. Você também pode adicionar outros campos.
Assim que o processo terminar, o comando ps
não retornará "sucesso" e o loop while
terminará.
Você pode ignorar a primeira linha se o PID que você deseja criar o perfil 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
....
Não há reputação suficiente para comentar, mas, para o psrecord, você também pode chamá-lo diretamente, de maneira programática, diretamente no Python:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
Se você tiver uma distribuição Linux cortada em que top não possui opção por processo (-p) ou opções relacionadas, poderá analisar a saída do comando top do nome do seu processo para obter as informações de uso da CPU por processo.
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 representa o uso da CPU por processo na saída do comando top na minha distribuição Linux incorporada
pidstat -p 7994 2
03:54:43 PM UID PID %usr %system %guest %CPU CPU Command
03:54:45 PM 0 7994 1.50 1.50 0.00 3.00 1 AliYunDun
03:54:47 PM 0 7994 1.00 1.00 0.00 2.00 0 AliYunDun
processo de impressão a cada 2 segundos uso de 7994 cpu
Se você precisar das médias por um período de tempo de um processo específico, tente a opção -c acumulativa de cima:
top -c a -pid PID
"-c a" encontrado na parte superior do Mac 10.8.5.
Para o Scientific Linux, a opção é -S, que pode ser configurada interativamente.