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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top