none
Fehlerhafte Performancewerte via Win32_PerfRawData_PerfDisk_LogicalDisk von RAID Volumes RRS feed

  • Frage

  • Hallo Forum,

    Ich lese für mein Server-Monitoring WMI-Daten von Servern aus.

    Nun musste ich leider feststellen, dass mein Script keine korrekten Daten liefert, wenn ich via Win32_PerfRawData_PerfDisk_LogicalDisk die Werte "DiskReadBytesPersec" bzw. "DiskWriteBytesPersec" von einem "Windows 2008 R2" Server abfrage und die logische Platte auf einem RAID 5 liegt. Bei einem RAID 1 im gleichen Server sind die Daten plausibel.

    Hier mein script zum abfragen der logischen Festplatte E:

     

    '  Zum ausführen in Kommandozeile folgendes eingeben
    '  cscript Diskload_E.vbs Servername
    '  Scipt zum auslesen der Plattenlast auf einem System
    '  (Sammelscript für MRTG)
    '  Christian Krauße 30.06.2011
    
    Set objArgs = wscript.Arguments
    strComputer = objArgs.item(0)
    
    '  Erreichbakeit prüfen
    Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
        ExecQuery("select * from Win32_PingStatus where address = '"_
        & strComputer & "'")
    For Each objStatus in objPing
      If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then 
        wscript.echo 1
        wscript.echo 1
        WScript.Echo "Offline"
        wscript.echo "Offline"
        wscript.echo "Offline"
      Else
    
    
      On Error Resume Next
      
      Const wbemFlagReturnImmediately = &h10
      Const wbemFlagForwardOnly = &h20
      
      
        ' WScript.Echo "Computer: " & strComputer
        
        Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
        Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfRawData_PerfDisk_LogicalDisk where Name = 'E:'", "WQL", _
                           wbemFlagReturnImmediately + wbemFlagForwardOnly )
      
        For Each objItem In colItems
          DiskLoadRead = objItem.DiskReadBytesPersec
          DiskLoadWrite = objItem.DiskWriteBytesPersec
      
        Next
      
      ' get Bootuptime 
      Set objDatetime = CreateObject("WbemScripting.SWbemDateTime")
      
      Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
      Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
      
      For Each objItem in colItems
        objDatetime.Value = objItem.LastBootUpTime
      '  WScript.Echo objDatetime.GetVarDate
      Next
      
      
      ' Output the results
      wscript.echo DiskLoadRead
      wscript.echo DiskLoadWrite
      WScript.Echo DateDiff("d", objDatetime.GetVarDate, Now) &" Tage" &" seit " & objDatetime.GetVarDate
      wscript.echo "Disk E: ReadLoad"
      wscript.echo "Disk E: WriteLoad"
      End If
    Next
    
    


    Zur Prüfung habe ich Daten zwischen den Logischen PLatten kopiert, wie schon weiter oben versuchte zu beschreiben, sind die Werte die mir die logische Platte auf einem RAID 1 liegt plausiebel, die der logischen Platte auf einem RAID 5 (im selben! Server) jedoch absolut unplausibel.

    Trifft hier http://support.microsoft.com/kb/970967 zu?

    ==>

    Von Vista beginnen, der Performance Monitoring Provider ist veraltet und wird Sie von der WMIPerfClass-Anbieter und der WMIPerfInst-Anbieter ersetzt. Weitere Informationen der folgenden Microsoft-Website:

    Wie greife ich mit VB nun auf WMIPerfClass zu? Oder mach ich das schon?

     

     

    Donnerstag, 30. Juni 2011 07:10

Antworten

  • > Daten liefert, wenn ich via Win32_PerfRawData_PerfDisk_LogicalDisk die
     
    Hi, Christian. Ohne großes Testing meinerseits:
     
    DiskReadBytesPerSec Data type: uint64
    Mach mal nen CDbl() auf die Werte... Vielleicht reicht das schon.
    DiskLoadRead = CDbl( objItem.DiskReadBytesPersec )
     
    mfg Martin
     

    Kein MVP, kein MCSE. Nur ein wenig Erfahrung.
    Donnerstag, 30. Juni 2011 08:42

Alle Antworten

  • > Daten liefert, wenn ich via Win32_PerfRawData_PerfDisk_LogicalDisk die
     
    Hi, Christian. Ohne großes Testing meinerseits:
     
    DiskReadBytesPerSec Data type: uint64
    Mach mal nen CDbl() auf die Werte... Vielleicht reicht das schon.
    DiskLoadRead = CDbl( objItem.DiskReadBytesPersec )
     
    mfg Martin
     

    Kein MVP, kein MCSE. Nur ein wenig Erfahrung.
    Donnerstag, 30. Juni 2011 08:42
  • Danke, auf sowas hätte ich nun gar nicht getippt, scheint zu funktionieren.

    ICh frag mich zwar wieso das gerade so Auftritt oder ob es mir nur hier in dem speziellen Fall aufgefallen ist.

     

    Donnerstag, 30. Juni 2011 10:55
  • > ICh frag mich zwar wieso das gerade so Auftritt oder ob es mir nur hier
    > in dem speziellen Fall aufgefallen ist.
     
    "Nur nicht aufgefallen" - ist ein grundsätzliches Risiko bei WMI per
    VBS, daß VBS nur Long macht, wenn man nicht explizit auf Double konvertiert.
     
    mfg Martin
     

    Kein MVP, kein MCSE. Nur ein wenig Erfahrung.
    Donnerstag, 30. Juni 2011 11:20