CPU-Auslastung aus /proc/stat ermitteln
Die Datei /proc/stat enthält verschiedene Informationen über die Kernel-Aktivität und ist auf jedem Linux-System verfügbar. Dieses Dokument erläutert, was Sie aus dieser Datei ablesen können.
Beispielausgabe von /proc/stat
> cat /proc/stat
cpu 1279636934 73759586 192327563 12184330186 543227057 56603 68503253 0 0
cpu0 297522664 8968710 49227610 418508635 72446546 56602 24904144 0 0
cpu1 227756034 9239849 30760881 424439349 196694821 0 7517172 0 0
cpu2 86902920 6411506 12412331 769921453 17877927 0 4809331 0 0
...
intr 47965531372 1240248033 2 0 0 0 0 0 0 1 0 0 0 4 0 0 0 0 128 0 0 0 360 38 0 0 0 ...
swap 72080475 70517875
ctxt 113062355059
btime 1423804268
realbtime 1423804268
processes 139640565
procs_running 3
procs_blocked 0
softirq 103392583578 0 3105824580 7624540 1792771145 2125464967 0 290942924 2131429539 52132004 3692080663
Die angezeigten Zahlen sind Zähler/Aggregate seit dem Booten des Systems. Der erste interessante Wert ist btime, der die UNIX-Epoch-Zeit angibt, zu der das System gebootet wurde. Je nach Kernel-Version und verfügbaren CPUs kann die Anzeige von /proc/stat leicht variieren.
Die "cpu"-Zeilen
Die erste "cpu"-Zeile ist ein Aggregat aller folgenden "cpuN"-Zeilen. Die Anzahl der "cpuN"-Zeilen entspricht der Anzahl der CPUs, die in /proc/cpuinfo angezeigt werden. Die Zahlen hinter den "cpu"-Zeilen geben die Zeit an, die die CPU mit verschiedenen Arten von Arbeit verbracht hat:
| Spalte | Name | Beschreibung | Verfügbar seit |
|---|---|---|---|
| 1 | user | Zeit für normale Verarbeitung im User-Modus. | |
| 2 | nice | Zeit mit "niced" Prozessen im User-Modus. | |
| 3 | system | Zeit im Kernel-Modus. | |
| 4 | idle | Leerlaufzeit. | |
| 5 | iowait | Wartezeit auf I/O-Vorgänge. Wird als Leerlaufzeit betrachtet. | seit 2.5.41 |
| 6 | irq | Zeit für Hardware-Interrupts. | seit 2.6.0 |
| 7 | softirq | Zeit für Software-Interrupts. | seit 2.6.0 |
| 8 | steal | Von anderen Betriebssystemen in virtueller Umgebung gestohlene Zeit. | seit 2.6.11 |
| 9 | guest | Zeit für virtuelle CPU oder Gast-OS unter Kernel-Kontrolle. | seit 2.6.24 |
Die Zeit wird in USER_HZ (auch Jiffies genannt) gemessen, typischerweise 1/100 Sekunden. USER_HZ ist eine Compile-Zeit-Konstante, die wie folgt abgefragt werden kann:
Shell:
getconf CLK_TCK
100
Aber wo ist die CPU-Auslastung?
Die CPU-Auslastung kann nur über ein Zeitintervall gemessen werden. Das bedeutet, wir müssen die Werte von /proc/stat in einem festen Intervall lesen und das Delta zwischen diesen Werten berechnen.
Wir k�nnen einfach alle Differenzen zwischen zwei aufeinanderfolgenden Lesevorg�ngen summieren, um die zwischen den Lesevorg�ngen verstrichene Zeit zu erhalten. Der Unterschied von Spalte 4 (idle) gibt uns die im Leerlauf verbrachte Zeit. Die Summe minus der Leerlaufzeit ergibt die Gesamt-CPU-Auslastung. Dividiert durch die Summe erhalten wir den Prozentsatz der CPU-Auslastung.
Beispiel
#!/bin/bash
while :; do
# Erste Zeile mit Aggregat aller CPUs abrufen
cpu_now=($(head -n1 /proc/stat))
# Alle Spalten außer der ersten ("cpu"-String)
cpu_sum="${cpu_now[@]:1}"
# Spaltentrenner (Leerzeichen) durch + ersetzen
cpu_sum=$(())
# Delta zwischen zwei Lesevorg�ngen
cpu_delta=$((cpu_sum - cpu_last_sum))
# Leerlaufzeit-Delta
cpu_idle=$((cpu_now[4] - cpu_last[4]))
# Berechnete Arbeitszeit
cpu_used=$((cpu_delta - cpu_idle))
# Prozentsatz berechnen
cpu_usage=$((100 * cpu_used / cpu_delta))
# Für nächsten Lesevorgang speichern
cpu_last=("")
cpu_last_sum=$cpu_sum
echo "CPU-Auslastung bei $cpu_usage%"
# Eine Sekunde warten
sleep 1
done