CPU-Last unter Linux

Die CPU-Last unter Linux herauszufinden ist keine triviale Aufgabe. Meinen Recherchen gibt es dafür keinen Systemruf, dh. der Kern berechnet keine Prozentangaben. Allerdings stellt /proc/stat eine Alternative dar. Das Lesen aus dieser Datei gibt bspw. folgendes Ergebnis:

cpu  17723 63 3433 3011074 11170 0 39 0 0 0
cpu0 3547 24 770 752221 3857 0 34 0 0 0
cpu1 3284 13 1467 752499 3496 0 2 0 0 0
cpu2 5211 12 608 752350 3006 0 1 0 0 0
cpu3 5680 13 587 754002 809 0 0 0 0 0
intr 497879 16 1990 0 0 0 0 0 0 1 0 0 0 0 0 0 0 33 282 0 12 0 0 0 29 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 31448 55558 45505 21 544 54512 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0
ctxt 2899461
btime 1448533088
processes 3094
procs_running 1
procs_blocked 0
softirq 376146 5 116856 1268 56819 45526 0 56504 62085 539 36544

Der für uns interessante Teil ist die erste Zeile. Die erste Zeile „cpu …“ summiert die Werte der darunterstehenden CPU-Kerne auf. Hier wird angegeben, wie viel Zeit die Kerne in welchen Modi verbracht haben seit Anbeginn der Zeit. Die Werte haben der Reihe nach (v.l.n.r) folgende Semantik (Die Angaben sind i.d.R. in 1/100 Sekunden):

  • user: Prozessausführung im Usermode
  • nice: Prozessausführung von Prozessen, die NICE-behandelt werden im usermode
  • system: Prozessausführung im Kernelmode
  • idle: Däumchendrehen
  • iowait: Auf I/O warten
  • irq: Interrupts behandeln
  • softirq: servicing softirqs (SW-Interrupts behandeln?)

Wollen wir davon nun eine Prozentangabe berechnen, wie „ausgelastet“ unser System ist, müssen wir /proc/stat periodisch abrufen, dort den idle-Werte rausnehmen und eine definierte (am besten sehr genaue!) Zeit warten und erneut abfragen. Nehmen wir an, wir warten eine Sekunde, dann:

float prozent = 100 - (cpu[i] - cpu[i-1]);

Dh. wir nehmen die Differenz, also die Zeit, die das System im idle verbracht hat, und ziehen diese Zeit von der gewarteten Zeit ab (100 Zeiteinheiten). Hier berechnen wir „zufällig“ Prozentangaben. Was wir eigentlich haben ist eine Angabe der Anzahl Zeiteinheiten, die das System NICHT im idle-Modus verbracht hat.

Zu Beachten ist, dass es bei Mehrkernsystem möglich ist, wenn wir 100 Zeiteinheiten warten, die Zähler um insgesamt 400 Zeiteinheiten weiterrücken, weil für jeden Prozessorkern 100 Zeiteinheiten vergehen.

Quellen