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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.