2009-06-06 9 views
3

Kennt jemand eine elegante Möglichkeit, "System Load" vorzugsweise mit Windows-Leistungsindikatoren zu bestimmen? In diesem Fall meine ich "System Load" im klassischen (UNIX) Sinn des Begriffs und nicht in dem häufig verwirrten "CPU Utilization" Prozentsatz.Ermitteln des "System Load"

Basierend auf meiner Lesung ... "System Load" wird in der Regel als Float dargestellt, die die Anzahl der Prozesse in einem ausführbaren Zustand (dh nicht die Anzahl der Prozesse, die derzeit aus dem einen oder anderen Grund gesperrt sind) definiert zu einer bestimmten Zeit laufen. Wikipedia gibt hier eine gute Erklärung - http://en.wikipedia.org/wiki/Load_(computing).

Nebenbei arbeite ich in C#, so dass alle Beispiele in dieser Sprache sehr geschätzt werden würden.

+0

Diese Frage besser beantwortet werden kann, um http://serverfault.com/ – kdmurray

+0

Er fragt speziell nach C# also SO ist der richtige Ort – Alex

Antwort

4

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. ' 
+0

Pax - danke für die Antwort das hilft sehr. Ich habe jedoch eine Follow-up-Frage, aber wenn ich mich richtig erinnere, zeigt die Last, wenn sie mit Systemen wie "top" dargestellt wird, den Wert als float (dh 1,35 oder 5,45). In Ihrem Beispiel würden Sie nur ganze Zahlen für die Systemlast erhalten. Irgendeine Idee, wo die gebrochenen Werte in plat kommen? –

+0

Macht nichts ... mein blöder ... diese Werte sind die Durchschnittswerte über 1, 5 und 15 Minuten. Aus irgendeinem Grund habe ich immer wieder daran gedacht, dass der erste Wert wirklich ein einzelner Zeitpunkt ist, nicht ein Durchschnitt über einen kleinen Zeitraum. –