Leer el uso de la CPU

2

Estoy construyendo un monitor de recursos basado en web para Linux.

Por ahora estoy deseando usar:

  • df para leer el estado de uso del disco duro
  • /proc/meminfo (a través del gato) para leer el estado de RAM
  • mpstat (del paquete sysstat) para leer el uso de la CPU

Mientras que la df y /proc/meminfo devuelve los datos casi al instante, mpstat retrasos para el intervalo que especifico, con el valor mínimo aceptado de 1 (en segundos).

¿Hay un lector de uso de la CPU en tiempo real, o hay una manera de hacer mpstat volver "al instante"?

salida de 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
joltmode
fuente
No sé mpstat. ¿Puede proporcionar un ejemplo de salida por favor?
mpy
@mpy, Q actualizado con el ejemplo.
joltmode
Es top ¿No es adecuado para sus propósitos por alguna razón?
Joseph R.
Estoy buscando una salida directa para STDOUT, que podría grep. top Encuestas continuamente.
joltmode

Respuestas:

4

Puedes usar top En modo batch y una única iteración:

top -bn 1

Yo también usaría free en lugar de analizar meminfo.

Otra forma es usar ps, agregue el% de CPU de cada proceso y divida por la cantidad de núcleos que tiene su máquina:

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);}'

Si su sistema tiene solo un núcleo, la secuencia de comandos anterior fallará, produciendo:

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

Para hacerlo funcionar, cambiar. k/(cores * cpus) a k/(cores==""?1:cores * cpus). Esto comprobará si el cores La variable no está vacía, si lo está, 1 será utilizado en su lugar.

terdon
fuente
Gracias por la free punta, y parece que voy a seguir con top entonces. ¡Aceptado!
joltmode
Hmm me parece que top No refleja el uso real. Realicé alrededor de 60 solicitudes web al servidor, y todas se mantuvieron en 97.7% de inactividad, aunque la tabla mostró un uso de 5.8% para top. Quiero decir, mostró 97.7% en el encabezado. %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. ¿Tengo que leer el uso total de otra parte o debo calcular mi final?
joltmode
@psycketom La tabla mostrada. 5.8% uso de un soltero núcleo para la parte superior. Los porcentajes son para cada núcleo individual. Así que si foo está tomando el 40% de un solo núcleo de una máquina de 2 núcleos, top Mostrará 40% para foono 20% como se podría esperar. También vea mi respuesta actualizada para otra forma de obtener el uso real.
terdon
Como mi sistema solo tiene un núcleo, esto terminó en un error. Cambiando a k/(cores==""?1:cores * cpus) arreglado el problema
joltmode