Lendo o uso da CPU

2

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 do 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 existe uma maneira de fazer com que mpstat retorne "instantaneamente"?

saída do 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
    
por joltmode 05.03.2013 / 08:33

1 resposta

4

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

top -bn 1

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

Outra maneira é usar ps , adicionar a% de CPU de cada processo e dividir 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 que seja possível, altere k/(cores * cpus) para k/(cores==""?1:cores * cpus) . Isso verificará se a variável cores não está vazia, se for, 1 será usado no lugar.

    
por 05.03.2013 / 12:03