Die Prozessornutzung oder -auslastung ist eine Messung über die Zeit. Eine Möglichkeit, die Auslastung in %
zu messen erfolgt durch Berechnung über zwei aufeinanderfolgende Lesevorgänge von /proc/stat
. Ein einfaches allgemeines Bash-Skript zur Berechnung des Prozentsatzes ist:
#!/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
Verwendung/Ausgabe:
$ bash procstat-cpu.sh
Current CPU Utilization : 10
Ausgabe über 5 Iterationen:
$ ( 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'
ergibt die folgende Zeile
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
Sie können jedes CPU-Feld ziehen, wobei Folgendes den Benutzer übernimmt CPU (uns)
top -bn1 | sed -n '/Cpu/p' | awk '{print $2}' | sed 's/..,//'
Ausgabe:
15.4%
Wenn Sie ein anderes Feld wie system möchten CPU (sy) Sie können das awk-Feld von $2,
änderntop -bn1 | sed -n '/Cpu/p' | awk '{print $3}' | sed 's/..,//'
Ausgabe:
5.3%
Wenn Sie eine andere CPU wünschen:
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.
So erhalten Sie die Gesamtnutzung in Prozent seit dem Hochfahren des Systems:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
So erhalten Sie den Nutzungsprozentsatz in der letzten Sekunde:
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
Erklärung
Ab man 5 proc
, die Bedeutung der ersten vier Zahlen auf der CPU-Zeile in /proc/stat
ist gegeben durch:
CPU 3357 0 4313 1362393
Die Zeit, gemessen in Einheiten von USER_HZ (1/100 Sekunde auf den meisten Architekturen, verwenden Sie sysconf(_SC_CLK_TCK), um den richtigen Wert zu erhalten), die das System im Benutzermodus verbracht hat, Benutzermodus mit niedriger Priorität (nice), system Modus bzw. die Idle-Task. Der letzte Wert sollte USER_HZ multipliziert mit dem zweiten Eintrag in der uptimepseudo-Datei sein.
Um die CPU-Auslastung zu erhalten, addieren wir die Benutzer- und Systemzeiten und dividieren durch die Summe aus Benutzer-, System- und Leerlaufzeit.
Schauen wir uns noch einmal die Berechnung für die gesamte CPU-Auslastung seit dem Hochfahren des Systems an:
awk '/cpu /{print 100*($2+$4)/($2+$4+$5)}' /proc/stat
Indem Sie verlangen, dass die Zeile mit cpu
übereinstimmt , erhalten wir Systemsummen. Die zweite Spalte ist die Benutzerzeit, die vierte die Systemzeit und die fünfte die Leerlaufzeit. Das Verhältnis wird mit 100 multipliziert, um einen Prozentsatz zu erhalten.
Betrachten wir nun die aktuelle CPU-Auslastung:
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
Hier steht /proc/cpu
zweimal im Abstand von einer Sekunde. In der Variable a
werden beim ersten Mal CPU-Benutzer + System und Benutzer+System+Leerlaufzeiten gespeichert . sleep
wird gerufen, um eine Sekunde zu warten. Dann /proc/cpu
wird ein zweites Mal gelesen. Die alte Benutzer+System-Summe wird von der neuen Summe subtrahiert und durch die Änderung der Summe aller Zeiten dividiert. Das Ergebnis wird mit 100 multipliziert, um es in Prozent umzuwandeln, und gedruckt.