web-development-kb-pt.site

Como monitorar o uso da CPU / memória de um único processo?

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.

194
Josh K

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
157
Michael Mrozek

psrecord

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: psrecord example

memory_profiler

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:

mprof

pilha de grafite & statsd

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:

grafana chart

pilha de grafite e telegraf

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

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 .

87
saaj

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

67
Denilson Sá Maia

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.

8
Aquarius Power

Eu normalmente uso os dois seguintes:

  1. 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.

  2. daemontools : uma coleção de ferramentas para gerenciar serviços UNIX

5
Hemant

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.

5
xebeche

Se você souber o nome do processo, poderá usar

top -p $(pidof <process_name>)
2
user4757345

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
  ....
2
theist

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)
2
ZettaCircl

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

1
Razan Paul
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

0
赵宝磊

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.

0
Kieleth