L'uso o l'utilizzo del processore è una misura nel tempo. Un modo per misurare l'utilizzo in %
avviene per calcolo su due letture successive di /proc/stat
. Un semplice script bash comune per calcolare la percentuale è:
#!/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/output:
$ bash procstat-cpu.sh
Current CPU Utilization : 10
output su 5 iterazioni:
$ ( 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'
fornisce la riga seguente
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
Puoi estrarre qualsiasi campo CPU con quanto segue prenderà l'utente CPU (noi)
top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
Uscita:
15.4%
Se vuoi un altro campo come system CPU (sy) puoi cambiare il campo awk da $2,
top -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
Uscita:
5.3%
Se vuoi un'altra 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.
Per ottenere la percentuale di utilizzo totale dall'attivazione del sistema:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Per ottenere la percentuale di utilizzo nell'ultimo secondo:
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
Spiegazione
Da man 5 proc
, il significato dei primi quattro numeri sulla riga cpu in /proc/stat
è dato da:
cpu 3357 0 4313 1362393
La quantità di tempo, misurata in unità di USER_HZ (1/100 di secondo sulla maggior parte delle architetture, utilizzare sysconf(_SC_CLK_TCK) per ottenere il valore corretto), che il sistema ha trascorso in modalità utente, modalità utente con priorità bassa (nice), sistema rispettivamente la modalità e l'attività inattiva. L'ultimo valore dovrebbe essere USER_HZ moltiplicato per la seconda voce nello pseudo-file uptime.
Per ottenere l'utilizzo della CPU, aggiungiamo i tempi dell'utente e del sistema e li dividiamo per il totale dei tempi di utente, sistema e inattività.
Diamo un'altra occhiata al calcolo dell'utilizzo totale della CPU dall'avvio del sistema:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Richiedendo che la riga corrisponda a cpu
, otteniamo i totali di sistema. La seconda colonna è l'ora dell'utente, la quarta è l'ora del sistema e la quinta è l'ora di inattività. Il rapporto viene moltiplicato per 100 per ottenere una percentuale.
Consideriamo ora il recente utilizzo della 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
Questo legge /proc/cpu
due volte, a distanza di un secondo. La prima volta, i tempi CPU utente + sistema e utente + sistema + inattività vengono salvati nella variabile a
. sleep
è chiamato a ritardare per un secondo. Quindi, /proc/cpu
viene letto una seconda volta. Il vecchio totale utente+sistema viene sottratto dal nuovo totale e diviso per la variazione del totale di tutti i tempi. Il risultato viene moltiplicato per 100 per convertirlo in percentuale e stampato.