L'utilisation ou l'utilisation du processeur est une mesure dans le temps. Une façon de mesurer l'utilisation dans %
est par calcul sur deux lectures successives de /proc/stat
. Un simple script bash commun pour calculer le pourcentage est :
#!/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
utilisation/sortie :
$ bash procstat-cpu.sh
Current CPU Utilization : 10
sortie sur 5 itérations :
$ ( 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'
donne la ligne suivante
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
Vous pouvez extraire n'importe quel champ CPU avec ce qui suit prendra l'utilisateur CPU (nous)
top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
Sortie :
15.4%
Si vous voulez un autre champ comme système CPU (sy) vous pouvez changer le champ awk de $2,
top -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
Sortie :
5.3%
Si vous voulez un autre 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.
Pour obtenir le pourcentage total d'utilisation depuis la mise en service du système :
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Pour obtenir le pourcentage d'utilisation sur la dernière seconde :
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
Explication
À partir de man 5 proc
, la signification des quatre premiers chiffres de la ligne cpu dans /proc/stat
est donné par :
processeur 3357 0 4313 1362393
Le temps, mesuré en unités de USER_HZ (1/100e de seconde sur la plupart des architectures, utilisez sysconf(_SC_CLK_TCK) pour obtenir la bonne valeur), que le système a passé en mode utilisateur, mode utilisateur avec une faible priorité (sympa), système mode et la tâche inactive, respectivement. La dernière valeur doit être USER_HZ fois la deuxième entrée dans le pseudo-fichier uptime.
Pour obtenir l'utilisation du processeur, nous ajoutons les temps utilisateur et système et divisons par le total des temps utilisateur, système et inactif.
Examinons à nouveau le calcul de l'utilisation totale du processeur depuis la mise en place du système :
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
En exigeant que la ligne corresponde à cpu
, nous obtenons les totaux du système. La deuxième colonne est le temps de l'utilisateur, la quatrième est le temps système et la cinquième est le temps d'inactivité. Le rapport est multiplié par 100 pour obtenir un pourcentage.
Considérons maintenant l'utilisation récente du processeur :
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
Cela lit /proc/cpu
deux fois, à une seconde d'intervalle. La première fois, les temps CPU utilisateur + système et utilisateur + système + inactif sont enregistrés dans la variable a
. sleep
est appelé à retarder d'une seconde. Ensuite, /proc/cpu
est lu une seconde fois. L'ancien total utilisateur + système est soustrait du nouveau total et divisé par la modification du total de tous les temps. Le résultat est multiplié par 100 pour le convertir en pourcentage et imprimé.