[WinAPI] Kernel-Auslastung bestimmen

theHacker

sieht vor lauter Ads den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.682
1.316
Moin.

Ich blick grade nicht durch, wie ich rechnen muss. Ziel ist es, wie im TaskManager die Prozessor-Auslastung und davon die Kernel-Auslastung zu bestimmen.

Die Funktion: https://msdn2.microsoft.com/en-us/library/ms724400.aspx

Zahlreiche Link über Google bringen diese Formel, die mir auch klar is:
Code:
CPUUsage = (KernelTime + UserTime - IdleTime) / (KernelTime + UserTime)
Dann hab ich die Prozessor-Auslastung - im TaskMgr die grüne Linie.

Und wie komm ich jetzt an die Kernel-Auslastung - rote Linie im TaskMgr ?
Ich weiß ja nicht, ob die verbrachte IdleTime im Kernel war oder nicht.

Meine Überlegung war:
Code:
KernelUsage = (KernelTime - IdleTime) / (KernelTime + UserTime)
UserUsage = (UserTime - IdleTime) / (KernelTime + UserTime)
Dann wäre aber mathematisch
Code:
CPUUsage = UserUsage + KernelUsage =
= (UserTime - IdleTime) / (KernelTime + UserTime) + (KernelTime - IdleTime) / (KernelTime + UserTime) = 
= (UserTime + KernelTime - 2*IdleTime) / (KernelTime + UserTime)
!= (UserTime + KernelTime - IdleTime) / (KernelTime + UserTime)
Also darf ich die IdleTime nur einmal reinrechnen. Nur wo ? Oder hab ichn Denkfehler ?
 
Code:
CPUUsage = (KernelTime + UserTime - IdleTime) / (KernelTime + UserTime)
Dann hab ich die Prozessor-Auslastung - im TaskMgr die grüne Linie.

Bist Du sicher dass die Formel nicht eigentlich so lautet?

Code:
CPUUsage = (KernelTime + UserTime) / (KernelTime + UserTime + IdleTime)

Und folglich:

Code:
KernelUsage = (KernelTime) / (KernelTime + UserTime + IdleTime)
UserUsage = (UserTime) / (KernelTime + UserTime + IdleTime)

Das Ergebniss * 100 wäre die Angabe in %.
 
Ja, sicher.

Meine Formel findet man im Netz hunderte Male, während mir deine Formel Fantasiewerte berechnet. TaskMgr steht auf 7%, mein Programm zeigt damit über 50% an :biggrin:
 
Du möchtest also nicht den Durchschnittswert sondern den Momentanwert?
(bzw. durchscnittswert eines kurzen Intervalls?)
 
Ich frage mich gerade, wie ein Stück Code um usermode idle sein kann. Ein Sleep ist ja ein System aufruf - es würde also im Kernel geschlafen. Warten auf I/O findet auch im Kernel statt. Ich möchte fast behaupten, daß im Usermode überhaupt nicht ge-idlet werden kann.

Insofern wäre die rote Linie:
(KernelTime - IdleTime) / KernelTime
 
Zuletzt bearbeitet:
Also auf die Gefahr hin jetzt Quatsch zu reden.

Das bedeutet ja dass die Gesamtzeit die KernelTime+UserTime ist und die IdleTime in der KernelTime mit drin steckt.

Daher ist auch meine Formel falsch, da sie davon ausgeht dass die Gesamtzeit die Kernel+User+Idlezeit ist.

Die KernelUsage müsste dann doch aber so berechnet werden, wie theHacker es schon gesagt hat.

KernelUsage=(KernelTime-IdleTime)/(KernetTime+Usertime)
Was bedeutet: Da die KernelTime die IdleTime beinhaltet, zieht man die IdleTime von der KernelTime ab und Teilt dann den Wert durch die Gesamtzeit.

Und:
KernelUsage_in_Prozent=(KernelTime-IdleTime)*100/(KernelTime+UserTime)

Aber:
UserUsage wäre dann doch:
UserUsage=(UserTime)/(KernelTime+Usertime)

Aber misst der Taskmanager nicht regelmässig die Zeiten und berechnet immer wieder für jedes Zeitintervall neue Werte?
Mit der Formel kann man doch nur den Durchschnittswert seit Systemstart bestimmen oder?
 
Zuletzt bearbeitet: