El uso o la utilización del procesador es una medida a lo largo del tiempo. Una forma de medir la utilización en %
es por cálculo sobre dos lecturas sucesivas de /proc/stat
. Un simple script bash común para calcular el porcentaje es:
#!/bin/bash
# Read /proc/stat file (for first datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_prev=$((user+system+nice+softirq+steal))
cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
usleep 50000
# Read /proc/stat file (for second datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_cur=$((user+system+nice+softirq+steal))
cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
# compute CPU utilization (%)
cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
printf " Current CPU Utilization : %s\n" "$cpu_util"
exit 0
uso/salida:
$ bash procstat-cpu.sh
Current CPU Utilization : 10
resultado de 5 iteraciones:
$ ( declare -i cnt=0; while [ "$cnt" -lt 5 ]; do bash procstat-cpu.sh; ((cnt++)); done )
Current CPU Utilization : 20
Current CPU Utilization : 18
Current CPU Utilization : 18
Current CPU Utilization : 18
Current CPU Utilization : 18
top -bn1 | sed -n '/Cpu/p'
da la siguiente línea
Cpu(s): 15.4%us, 5.3%sy, 0.0%ni, 78.6%id, 0.5%wa, 0.0%hi, 0.1%si, 0.0%st
Puede extraer cualquier campo de CPU con lo siguiente tomará el usuario CPU (nosotros)
top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
Salida:
15.4%
Si desea otro campo como sistema CPU (sy) puede cambiar el campo awk de $2,
top -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
Salida:
5.3%
Si quieres otra CPU:
us: user CPU used by user processes
sy: system CPU used by system/kernel processes
ni: nice CPU used by processes that were reniced
id: idle CPU not used
wa: io wait Essentially idle CPU waiting on IO devices
hi: hardware irq CPU used to service hardware IRQs
si: software irq CPU used to service soft IRQs
st: steal time CPU time which the hypervisor dedicated (or ‘stole’) for other guests in the system.
Para obtener el porcentaje total de uso desde que se puso en marcha el sistema:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Para obtener el porcentaje de uso durante el último segundo:
awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}' /proc/stat
Explicación
Desde man 5 proc
, el significado de los primeros cuatro números en la línea de cpu en /proc/stat
está dado por:
cpu 3357 0 4313 1362393
La cantidad de tiempo, medida en unidades de USER_HZ (1/100 de segundo en la mayoría de las arquitecturas, use sysconf(_SC_CLK_TCK) para obtener el valor correcto), que el sistema pasó en modo de usuario, modo de usuario con prioridad baja (agradable), sistema modo y la tarea inactiva, respectivamente. El último valor debe ser USER_HZ multiplicado por la segunda entrada en el pseudoarchivo de tiempo de actividad.
Para obtener el uso de la CPU, sumamos los tiempos del usuario y del sistema y lo dividimos por el total de tiempo de usuario, sistema e inactividad.
Veamos de nuevo el cálculo del uso total de la CPU desde que el sistema está activo:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Al requerir que la línea coincida con cpu
, obtenemos los totales del sistema. La segunda columna es el tiempo del usuario, la cuarta es la hora del sistema y la quinta es el tiempo de inactividad. La proporción se multiplica por 100 para obtener un porcentaje.
Ahora, consideremos el uso reciente de la CPU:
awk -v a="$(awk '/cpu /{print $2+$4,$2+$4+$5}' /proc/stat; sleep 1)" '/cpu /{split(a,b," "); print 100*($2+$4-b[1])/($2+$4+$5-b[2])}' /proc/stat
Esto dice /proc/cpu
dos veces, con un segundo de diferencia. La primera vez, los tiempos de CPU usuario + sistema y usuario + sistema + inactividad se guardan en la variable a
. sleep
es llamado a retrasar un segundo. Entonces, /proc/cpu
se lee por segunda vez. El antiguo total usuario+sistema se resta del nuevo total y se divide por el cambio en el total de todos los tiempos. El resultado se multiplica por 100 para convertirlo en porcentaje y se imprime.