Obter uso da CPU no shell script?
Pergunta
Estou correndo alguns JMeter testa em um processo Java para determinar o quão responsivo um aplicativo da web está sob carga (mais de 500 usuários).O JMeter fornecerá o tempo de resposta para cada solicitação da web, e eu escrevi um script para executar ping no Tomcat Manager a cada X segundos, o que me dará o tamanho atual do heap da JVM.
Gostaria de coletar estatísticas no servidor sobre a% de CPU usada pelo Tomcat.Eu tentei fazer isso em um script de shell usando ps
assim:
PS_RESULTS=`ps -o pcpu,pmem,nlwp -p $PID`
...executando o comando a cada X segundos e anexando os resultados a um arquivo de texto.(para quem está se perguntando, pmem
=% uso de memória e nlwp
é o número de threads)
No entanto, descobri que isso fornece uma definição diferente de "% de utilização da CPU" da que eu gostaria - de acordo com as páginas de manual do ps, pcpu
é definido como:
utilização da CPU do processo no formato "##.#".É o tempo de CPU utilizado dividido pelo tempo de execução do processo (relação cputime/realtime), expresso em porcentagem.
Em outras palavras, pcpu
me dá a% de utilização da CPU para o processo do vida do processo.
Como quero obter uma amostra a cada X segundos, gostaria de coletar a utilização da CPU do processo apenas no momento atual - semelhante ao que top
me daria (utilização da CPU do processo desde a última atualização).
Como posso coletar isso em um script de shell?
Solução
Usar top -b
(e outras opções se você quiser saídas diferentes).Ele apenas será despejado no stdout em vez de pular para uma janela de maldições.
Outras dicas
A ferramenta mais útil que encontrei para monitorar um servidor durante a execução de um teste como o JMeter é dstat.Ele não apenas fornece uma variedade de estatísticas do servidor, mas também envia para csv para fácil importação para uma planilha e permite estender a ferramenta com módulos escritos em Python.
Carga do usuário: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $2}' |sed 's/.[^.]*$//'
Carga do sistema: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $3}' |sed 's/.[^.]*$//'
Carga ociosa: top -b -n 1 |grep Cpu |tail -n 1 |awk '{print $5}' |sed 's/.[^.]*$//'
Cada resultado é um decimal redondo.
Pensando bem, eu usaria a visualização do sistema de arquivos /proc do estado do sistema - veja homem 5 processo para ver o formato da entrada para /proc/PID/stat, que contém informações totais de uso da CPU, e use /proc/stat para obter informações globais do sistema.Para obter o uso do "horário atual", você provavelmente quer dizer "CPU usada nos últimos N segundos";pegue duas amostras a uma curta distância uma da outra para ver a taxa atual de consumo de CPU.Você pode então transformar esses valores em algo útil.Na verdade, este é provavelmente mais um trabalho Perl/Ruby/Python do que um script de shell puro.
Você pode obter os dados aproximados que procura com /proc/PID/status, que fornece uma média de suspensão para o processo.Dados bastante grosseiros, no entanto.
também use 1 como contagem de iteração, para que você obtenha o instantâneo atual sem esperar para obter outro no tempo de atraso $.
top -b -n 1