¿Hay alguna manera de calcular el porcentaje de utilización de la CPU leyendo / proc / stat de una vez?

12

Supongo que la pregunta es, ¿podría calcular de alguna manera el porcentaje de utilización de la CPU simplemente leyendo el / proc / stat una vez?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

Estoy pensando en resumir las columnas excepto el IOWait (estaba leyendo en alguna parte que se cuenta en inactivo) y eso me daría el 100% y cada columna individual podría convertirse en porcentaje por (column / 100_percent) * 100.

  • usuario: procesos normales que se ejecutan en modo usuario
  • agradable: procesos vistos que se ejecutan en modo de usuario
  • sistema: procesos que se ejecutan en modo kernel
  • inactivo: pulgares giratorios
  • iowait: esperando que se complete la E / S
  • irq: interrupciones de servicio
  • softirq: mantenimiento de softirqs
  • robar: espera involuntaria
  • invitado: ejecutar un invitado normal
  • guest_nice: ejecutar un invitado ingenioso

¿Es este un enfoque viable o estoy totalmente fuera de la pista?

Istvan
fuente

Respuestas:

11

Está en el camino correcto, toputiliza este archivo para este propósito. Pero necesitas leerlo más de una vez.

La utilización es una medida de uso a lo largo del tiempo. Puede leerlo una vez que sepa el tiempo de actividad en segundos del host, luego dividirlo por eso, pero eso le daría una tasa de utilidad del host desde que se inició la máquina.

Si desea una tasa superior a 5 segundos, debe leer el archivo una vez, dormir durante 5 segundos, volver a leerlo, obtener la diferencia de los cálculos y dividir por 5.

Matthew Ife
fuente
6

Tu enfoque es correcto. Puede usar / proc / stat como datos sin procesar y alimentar, por ejemplo, rrdtool con ellos. He hecho algo así, así que sé que es 100% posible. A continuación, puede graficar la carga de todo el sistema o cada núcleo individualmente.

Aquí hay un ejemplo de trabajo propio: ingrese la descripción de la imagen aquí

Reasumir -> Puedes hacerlo, no es difícil solo matemática básica y mis gráficos son un ejemplo en vivo de eso. Para recopilar datos, hago una instantánea de / proc / stat en un archivo temporal ubicado en ramdisk y luego analizo ese archivo para recopilar datos cada 1 minuto.

cómo analizo los datos (fragmento de script bash):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

después de obtener datos en la base de datos rrd Puede graficar y el cielo es el límite :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

Bartłomiej Zarzecki
fuente
¿Cómo se analizan los datos?
ewwhite
@ewwhite -> Edité mi respuesta para mostrar cómo analizo los datos.
Bartłomiej Zarzecki
Hermosos gráficos! Con respecto a la anotación de columna que falta: askubuntu.com/a/120961/451886 . Si se ejecuta en una máquina virtual, tal vez sea el contador de "robo".
rkagerer
¡+1 para rrdtool y ramdisk!
shadi
4

Si quieres un revestimiento, puede verse así:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

El resultado: 97.17000000000000000000

Cómo funciona:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

produce ( 1055057784 - 1055058055 )/100entonces este avance de línea a bc. Tendrá algo así -7.84000000000000000000, luego envuélvalo 100-$(value)y alimente a bc nuevamente

Allí: sleep #- 1 segundo de retraso, si cambia este valor, el resultado intermedio se debe dividir entre la cantidad de segundos. $5- 5to campo, según man procy http://www.linuxhowtos.org/System/procstat.htm

Avísame si esto no funciona para ti.

Putnik
fuente
0

O si está satisfecho con solo dos dígitos después del punto awk, puede hacerlo todo de una manera mucho más simple y legible:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
slaxor
fuente