12 votos

Hay una manera de calcular el porcentaje de utilización de la CPU mediante la lectura de /proc/stat a la vez?

Supongo que la pregunta es, ¿puedo de alguna manera calcular el porcentaje de uso de CPU con solo leer el archivo /proc/stat de una vez?

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

Estoy pensando que resume las columnas, excepto el IOWait (yo había leído en alguna parte que se cuenta en el vacío) y que me iba a dar el 100% y cada columna individual podría ser convertido en un porcentaje (columna/100_percent)*100.

  • usuario: normal de los procesos que se ejecutan en modo de usuario
  • niza: niced los procesos que se ejecutan en modo de usuario
  • sistema: los procesos que se ejecutan en modo kernel
  • inactivo: con los pulgares
  • iowait: a la espera de I/O para completar
  • irq: servicio de interrupciones
  • softirq: servicio softirqs
  • robar: involuntarias esperar
  • invitado: la ejecución de un cliente normal
  • guest_nice: la ejecución de un niced invitado

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

11voto

Matthew Ife Puntos 12680

Usted está en el camino correcto, top utiliza este archivo para este propósito. Pero tendrás que leer más de una vez.

La utilización de es un es una medida de uso a través del tiempo. Usted puede leer proporcionando una vez que usted conoce el tiempo en segundos de la hostia, y luego divida por que, pero que daría una tasa de utilidad de la acogida ya que la máquina se reinicia.

Si desea una tasa de más de 5 segundos, debe leer el archivo una vez, dormir durante 5 segundos, vuelva a leerla, obtener la diferencia de los cálculos y dividir por 5.

6voto

Su enfoque es correcto. Puede utilizar el archivo /proc/stat como datos en bruto y de los piensos, por ejemplo, rrdtool con ella. Me he hecho a mí mismo algo como esto, así que yo sé al 100% es posible. Usted puede muy bien entonces gráfico de todo el sistema de carga o de cada núcleo individual.

Aquí está un ejemplo de mi propia: enter image description here

De reasumir -> Usted puede hacerlo, no es difícil solo lo básico de las matemáticas y los gráficos son un vivo ejemplo de eso. Para la recolección de datos tengo que hacer una instantánea de /proc/stat a un archivo temporal localted en ramdisk y, a continuación, analizar el archivo para recoger los datos de cada 1 minuto.

cómo analizar los datos (fragmento de script de 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 los datos en la base de datos rrd puede gráfico y el cielo es el límite :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

4voto

Ibn Saeed Puntos 1082

Si desea oneliner es posible que se parece a esto:

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 )/100 entonces esta línea de alimentación de ac. Tendrán algo parecido a -7.84000000000000000000, a continuación, sólo envolver a 100-$(value) y alimentar a bc de nuevo

No: sleep # - 1 segundo de retraso, si cambia este valor, entonces el resultado intermedio debe ser dividido para el número de segundos. $5 - 5 de campo, de acuerdo a man proc y http://www.linuxhowtos.org/System/procstat.htm

Por favor, hágamelo saber si esto no funciona para usted.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: