Questão Lendo o uso da CPU


Eu estou construindo um monitor de recursos baseado em Linux.

Por enquanto estou ansioso para usar:

  • df para ler o status de uso do HDD
  • /proc/meminfo (através de cat) para ler o status da RAM
  • mpstat (do pacote sysstat) para ler o uso da CPU

Enquanto o df e /proc/meminfo retorna os dados quase instantaneamente, mpstat atrasos para o intervalo que eu especifico - com o valor mínimo aceito sendo 1 (em segundos).

Existe um leitor de uso da CPU em tempo real, ou há uma maneira de fazer mpstat retornar "instantaneamente"?

saída mpstat:

[psycketom@stone ~]# mpstat -P ALL 1 1
Linux 3.5.4-1-ARCH (stone)      03/05/2013      _x86_64_        (1 CPU)

11:33:15 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:33:16 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:33:16 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

2


origem


Eu não sei mpstat. Você pode fornecer um exemplo de saída por favor? - mpy
@mpy, Q atualizado com o exemplo. - joltmode
É top não é adequado para seus propósitos por algum motivo? - Joseph R.
Estou procurando uma saída direta para STDOUT, que eu poderia grep. top continuamente pesquisas. - joltmode


Respostas:


Você pode usar top no modo batch e uma única iteração:

top -bn 1

Eu também usaria free em vez de analisar meminfo.

Outra maneira é usar ps, adicione a porcentagem da CPU de cada processo e divida pelo número de núcleos que sua máquina possui:

ps axo pcpu | 
 gawk -v cores=`grep -m 1 cores /proc/cpuinfo | cut -d ' ' -f 3` \
      -v cpus=`grep -c processor /proc/cpuinfo` \
         '{k+=$1}END{print k/(cores * cpus);}'

Se o seu sistema tiver apenas um núcleo, o script acima falhará, produzindo:

gawk: cmd. line:1: (FILENAME=- FNR=83) fatal: division by zero attempted

Para fazê-lo funcionar, mude k/(cores * cpus) para k/(cores==""?1:cores * cpus). Isto irá verificar se o cores variável não está vazia, se for, 1 será usado em vez disso.


4



Obrigado pelo free dica, e parece que eu vou ficar com top então. Aceitaram! - joltmode
Hmm, parece-me que top não reflete o uso real. Fiz cerca de 60 solicitações da web para o servidor, e todas ficaram em 97,7% ociosas, embora a tabela mostrasse uso em 5,8% para top. Quer dizer, mostrou 97,7% no cabeçalho %Cpu(s): 1.5 us, 0.6 sy, 0.1 ni, 97.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st. Eu tenho que ler o uso total de outro lugar ou devo calcular do meu jeito? - joltmode
@psycketom A tabela mostrada 5.8% uso de um solteiro núcleo por cima. As porcentagens são para cada núcleo individual. Então se foo está levando 40% de um único núcleo de uma máquina de 2 núcleos, top mostrará 40% para foo, não 20% Como você pode esperar. Veja também minha resposta atualizada para outra maneira de obter o uso real. - terdon
Como meu sistema tem apenas um núcleo, isso resultou em um erro. Mudando para k/(cores==""?1:cores * cpus) resolveu o problema. - joltmode