Systemlast, im UNIX-Sinne (und wenn ich mich richtig erinnere), ist die Anzahl der Prozesse, die ausgeführt werden können, die eigentlich nicht auf einer CPU laufen (gemittelt über einen Zeitraum). Dienstprogramme wie top
zeigen diese Last über zum Beispiel die letzten 1, 5 und 15 Minuten.
Ich glaube nicht, dass dies mit dem Standard Win32 WMI Prozess Klassen möglich ist. Das Prozessstatusfeld (ExecutionState)
in den WMI Win32_Process
Objekten wird als nicht verwendet dokumentiert.
Allerdings bietet die Thread-Klasse diese Information (und es ist wahrscheinlich ein besserer Indikator, da moderne Betriebssysteme eher Threads als Prozesse planen). Die Win32_Thread
Klasse hat ein ExecutionState
Feld, das zu einem der festgelegt ist:
- 0 Unbekannt
- 1 Andere
- 2 Bereit
- 3 Laufenden
Blockieren
- 5 Blockierte Suspended
- 6 Suspended Ready
Wenn Sie eine Abfrage dieser Klasse durchführen und die Nummer von Typ 2 (und möglicherweise Typ 6; Ich glaube suspendiert bedeutet in diesem Zusammenhang ausgelagert), das sollte dir deinen Lade-Snapshot geben. Sie müssten sie dann selbst mitteln, wenn Sie Durchschnittswerte wollten.
Alternativ gibt es ein ThreadState
in dieser Klasse auch:
- 0 Initialized (von den Mikro-Kernel erkannt).
- 1 Bereit (vorbereitet für den nächsten verfügbaren Prozessor).
- 2 Ausführen (Ausführen).
- 3 Standby (wird ausgeführt, nur ein Thread kann gleichzeitig in diesem Zustand sein).
- 4 beendet (abgeschlossene Ausführung).
- 5 Warten (nicht bereit für den Prozessor, wenn es fertig ist, wird es neu geplant).
- 6 Übergang (Warten auf Ressourcen außer dem Prozessor).
- 7 Unbekannt (Status ist unbekannt). , so dass Sie in den Status 1 oder 3 zählen können.
Sie mich nicht fragen, warum gibt es zwei Felder ähnliche Informationen zeigen, oder das, was der Unterschied ist. Ich habe längst aufgehört, Microsoft mit ihren WMI-Informationen zu hinterfragen, ich muss nur die Mächte davon überzeugen, dass meine Wahl eine brauchbare ist :-)
Nach der Entwicklung eines Windows-Clients für unsere eigene Monitoring-Anwendung Ich würde nur vorschlagen, für 1-Sekunden-Schnappschüsse zu gehen und diese über jeden Zeitrahmen zu mitteln, über den Sie berichten müssen. VBScript und WMI scheinen selbst bei einer Abfrage pro Sekunde bemerkenswert stabil zu sein - es scheint nicht zu viel CPU-Belastung zu verursachen und solange Sie alles freigeben, was Sie verwenden, können Sie längere Zeit laufen.
Also, jede Sekunde, Sie so etwas wie tun würde (in VBScript, und aus dem Gedächtnis, da ich nicht bereit Zugriff auf den Code von hier):
set objWmi = GetObject("winmgmts:\\.\root\cimv2")
set threadList = objWmi.ExecQuery("select * from Win32_Thread",,48)
sysLoad = 0
for each objThread in threadList
if objThread.ThreadState = 1 or objThread.ThreadState = 3 then
sysLoad = sysLoad + 1
end if
next
' sysLoad now contains number of threads waiting for a CPU. '
Diese Frage besser beantwortet werden kann, um http://serverfault.com/ – kdmurray
Er fragt speziell nach C# also SO ist der richtige Ort – Alex