email smartphone

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