alucard7
Goto Top

Mehrkern CPU Auslastung erkennen und verarbeiten

Hallo an alle Mitglieder,

ich habe ein kleines Problem und zwar soll ich eine kleine Batch-Datei schreiben, die bestimmtes Servermonitoring betreibt.
Das klappt soweit ganz gut, nur habe ich jetzt noch Probleme bei der Erkennung der CPU Auslastung bei Mehrkern CPUs.

Gibt es irgendwelche Möglichkeiten die Auslastung der einzelnen Kerne auszulesen, sodass man diese am Ende in einer bat verarbeiten kann?

mfg Alucard7

Content-Key: 161677

Url: https://administrator.de/contentid/161677

Printed on: April 25, 2024 at 08:04 o'clock

Member: AndreasHoster
AndreasHoster Feb 28, 2011 at 11:10:43 (UTC)
Goto Top
Möglichkeiten gibts fast immer, Frage ist nur der Aufwand es zu realisieren
Das Zauberwort hier heißt WMI (=Windows Management Instrumentation).
Die WMI Klasse für den Prozessor: Win32_PerfFormattedData_PerfOS_Processor
Doku bei MS: http://msdn.microsoft.com/en-us/library/aa394271(v=vs.85).aspx

Integration in Batch dürfte über WMIC.exe gehen, ich benutze für sowas immer den Windows Scrpting Host.
Wie es im WSH aussieht, sieht man am einfachsten, indem man die Scriptomatic von MS benutzt: http://www.microsoft.com/germany/technet/datenbank/articles/600322.mspx
Download der Scriptomatic: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=09dfc342-64 ...
Member: Alucard7
Alucard7 Feb 28, 2011 at 16:59:56 (UTC)
Goto Top
Hi,
danke für die schnelle Antwort.
War aber mein Fehler zu erwähnen, dass das Skript auf win 2000 server laufen muss und deshalb wohl wmi ausscheidet, da ich da eine Fehlermeldung bekam beim ausführen, dass iwelche dlls fehlen. Hab allerdings auch mit einer Version von win xp getestet, da ich keine für früher im inet finden konnte.
Diese Klasse hab ich schon ausprobiert über vbs, jedoch erhielt ich für mich nicht nachvollziehbare Ergebnisse, bzw. keine eindeutige Auslastung für verschiedene Kerne.
Falls ich iwo nicht richtig getestet habe, bitte berichtie mich ;)

Habe imo keine Zeit für deinen 2. Absatz zu testen, melde mcih später ncohmal.

mfg Alucard7
Member: AndreasHoster
AndreasHoster Mar 01, 2011 at 07:42:54 (UTC)
Goto Top
Beispiel aus der Scriptomatic (leicht abgewandelt):
On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
' Hier die abzufragenden Computer eintragen . ist der lokale  
arrComputers = Array(".")  
For Each strComputer In arrComputers
   WScript.Echo
   WScript.Echo "=========================================="  
   WScript.Echo "Computer: " & strComputer  
   WScript.Echo "=========================================="  

   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor", "WQL", _  
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)

   For Each objItem In colItems
      WScript.Echo "Name: " & objItem.Name  
      WScript.Echo "PercentIdleTime: " & objItem.PercentIdleTime  
      WScript.Echo "PercentInterruptTime: " & objItem.PercentInterruptTime  
      WScript.Echo "PercentPrivilegedTime: " & objItem.PercentPrivilegedTime  
      WScript.Echo "PercentProcessorTime: " & objItem.PercentProcessorTime  
      WScript.Echo "PercentUserTime: " & objItem.PercentUserTime  
      WScript.Echo "*****************************************************"  
   Next
Next

Das ergibt bei mir als Ausgabe:
Computer: .
Name: 0
PercentIdleTime: 33
PercentInterruptTime: 0
PercentPrivilegedTime: 0
PercentProcessorTime: 66
PercentUserTime: 63
*
Name: 1
PercentIdleTime: 63
PercentInterruptTime: 0
PercentPrivilegedTime: 0
PercentProcessorTime: 36
PercentUserTime: 33
*
Name: _Total
PercentIdleTime: 0
PercentInterruptTime: 0
PercentPrivilegedTime: 0
PercentProcessorTime: 51
PercentUserTime: 48
*

Name ist die Instanz wie im PerfMon ausgewählt (0,1 und _Total)
Wie man bei PercentProcessorTime sieht, ist der Eine zu 36, der Andere zu 66 Prozent ausgelastet, in der Summe das System zu 51 Prozent.
Ist doch das, was Du haben willst, oder nicht?
Und laut http://www.microsoft.com/germany/technet/datenbank/articles/600682.mspx ist WMI auch bei Win2000 dabei.
Member: Alucard7
Alucard7 Mar 01, 2011 at 08:06:43 (UTC)
Goto Top
Hi,
Ja das ist genau das was ich brauche, Vielen Dank!

Das mit wmi war auf die wmic.exe bezogen und mal wieder unklar ausgedrückt von mir xD. Über diese wollte ich mit "WMIC CPU GET LoadPercentage" auf die CPU zugreifen, jedoch war diese .exe nicht auf dem System vorhanden und jene von win xp wollte win 2000 nicht nehmen.

Wie gesagt, dass mit der Win32_PerfFormattedData... hatte ich ausprobiert, nur konnte ich die mehrfachen Ausgaben nicht als verwertbare Ergebnisse erkennen, ala den Wald vor lauter Bäumen nicht xD.

Nochmals vielen Dank!

mfg alucard7

Edit: Problem besteht weiterhin, da die Klasse Win32_PerfFormattedData_PerfOS_Processor nicht von win 2000 unterstützt wird. Als Ersatz soll die Klasse Win32_PerfRawData_PerfProc_Process verwendet werden, jedoch spuckt diese lange Reihen von:

Name: 1 PercentProcessorTime: 435685000000
Name: 2 PercentProcessorTime: 665937500
Name: 3 PercentProcessorTime: 312500
...

aus. Damit weiß ich gar ncihts anzufangen.

mfg alucard7