Sie stellen nach einem Update des Windows Server Operating System Managementpacks fest, dass Ihre Clusterdisks, die als Mountpoints eingebunden sind, nicht mehr als Logical Disk in SCOM erkannt werden? Sie wollten schon immer die Performance Ihrer Clusterdisks mit SCOM überwachen? Dann lesen Sie in diesem Blogpost die Hintergründe und Lösung.


In der letzten Woche habe ich mich mal wieder mit dem Thema Mountpoint Discovery von SCOM auseinandersetzen müssen. Vor knapp 2 Jahren hatte mich das Thema schon mal beschäftigt. Damals ging es um das Discovery von dynamischen Disks. Grundsätzliches zu Mountpoints findet man in meinem Blogpost von damals.
Im aktuellen Post geht es nun um das Discovery von Clusterdisks, die als Mountpoints eingebunden sind. Ich bezeichne diese im weiteren Verlauf als „geclusterte Mountpoints“.

Hintergrund zu den Problemen mit Clusterdisks

Wir betreiben seit einigen Jahren bei einem unserer Kunden mehrere SQL-Cluster und nutzen dabei intensiv Mountpoints anstatt Laufwerksbuchstaben. Dies hat den Vorteil, dass wir auch bei größeren Installationen mit mehreren SQL-Instanzen auf einem Cluster nicht an die Grenzen der maximalen Anzahl an Laufwerksbuchstaben stoßen. Aufgrund der bis dato immer noch fehlenden Implementierung von Performance Collection Rules für Clusterdisks durch die Managementpacks von Microsoft haben wir bisher die Performancewerte der Disks von diesen Clustern über die Logical Disks, welche über das Mountpoint Discovery erkannt wurden, ausgelesen. Nachteil dabei war, dass die so erkannten Mountpoints nicht der Clusterinstanz zugeordnet waren, sondern dem Clusternode. Somit mussten wir z.B. Reports anpassen, wenn Clusterinstanzen mal den Knoten gewechselt haben. Dies war aber kein größeres Problem für uns, da es eine festgelegte Instanzverteilung gab. Über diesen Nachteil konnten wir also getrost hinwegsehen.

Problembeschreibung

Nach einem Update des Windows Server Operating System Managementpacks stellten wir fest, dass die Performanceauswertungen nicht mehr möglich waren und nach kurzem Troubleshooting fanden wir heraus, dass es daran lag, dass die geclusterten Mountpoints nicht mehr erkannt wurden. Seltsamerweise galt das nicht für alle, es fanden sich also sporadisch doch noch geclusterte Mountpoints als Logical Disk.

Analyse

Nach einiger Recherche fanden wir dann den entscheidenden Hinweis:

 

Änderungen im Windows Server Operating System – MP
Änderungen im Windows Server Operating System – MP

 

Das Discovery wurde also mit Version 6.0.7316.0 des Windows Server Operating System – Managementpacks modifiziert und seither werden keine geclusterten Mountpoints mehr als Logical Disk erkannt.

Es stellte sich nun die Frage, warum manche Clusterdisks trotzdem noch als Mountpoints erkannt wurden. Ich habe wieder etwas Reverse Engineering betrieben und mir die Discoveryscripte angeschaut.

So werden die Clusterdisks im neuen Discovery Script gefiltert:

 

Analyse des Mountpoint Discovery Scripts
Analyse des Mountpoint Discovery Scripts

 

Wenn man sich die VolumeGUIDs der Clusterdisks mit Powershell in WMI anschaut, sieht man den Unterschied. Bei der Clusterdisk, die immer noch als Mountpoint erkannt wird (rot markiert), sind Path und VolumeGUID der Clusterdisk nicht identisch der DeviceID des Volumes. Das grün markierte Bespiel zeigt, wie es normalerweise ist.

Analyse Matching Volume zur Clusterdisk
Analyse Matching Volume zur Clusterdisk

Somit werden solche Clusterdisks immer noch zusätzlich als Logical Disks erkannt. Hier muss Microsoft nachbessern. Ich kann auch sagen wie. Dazu unten mehr.

Lösung

Ein Kontakt zum Microsoft Support brachte leider keine Lösung, bestätigte lediglich den Umstand, dass geclusterte Mountpoints nicht mehr erkannt werden und es keine Performance Rules für Clusterdisks in den Standard MPs von Microsoft gibt.
Wer jetzt denkt, dass es ja ganz einfach ist und man sich die Performance Rules selbst anlegen kann, der muss wissen, dass dies für den speziellen Fall von geclusterten Mountpoints nicht so einfach geht. Kevin Holman beschreibt in seinem Blogpost, wie man Performance Collection Rules für Clusterdisks anlegen muss, damit sie auch im Reporting auswertbar sind. Für uns ein Muss. In den Kommentaren zu seinem Blogpost ist die Besonderheit bezüglich geclusterten Mountpoints beschrieben.
Ich habe mich dann mit dem Thema Performance Collection Rules für Clusterdisks weiter auseinandergesetzt und ein Managementpack entwickelt, welches die üblichen Verdächtigen an Performancecountern für Clusterdisks sammelt:

Disk Reads / sec
Disk Writes / sec
Disk Transfers / sec
Disk Read Bytes / sec
Disk Write Bytes / sec
Disk Bytes /sec

Ich nutze hierbei nicht Perfomance Based Collection Rules sondern Probe Based Script Collection Rules. Im Script mache ich das Matching von der Clusterdisk zum Volume, über welches ich dann an den richtigen Performance Counter von Windows heran komme. Für das Matching nutze ich nicht wie oben beschrieben die VolumeGUID der Clusterdisk und die DeviceID des Volumes, sondern den Parameter Serialnumber, den es auf beiden WMI-Klassen Win32_Volume und MSCluster_DiskPartition gibt und der auch bei den oben genannten Ausnahmen (wenn VolumeGUID und DeviceID nicht matchen) matcht.

Das Managementpack stelle ich der Community bereit. Es kann hier aus der Technet Gallery heruntergeladen werden. Dort beschreibe ich es auch nochmals etwas genauer. An dieser Stelle möchte nur noch das Powershell – Script, welches ich in der Collection Rule verwende, bereitstellen.

[code lang=“powershell“]param($Clusterdisk, $PerfCounterName, $DebugMode)
#Load the MOMScript API and the PropertBag provider
$API = New-Object -comObject „MOM.ScriptAPI“

#setting variables
$strComputer = „.“
#first argument must be the partition name from a clusterdisk object
$drive = $ClusterDisk
#second argument is the performance counter
$strperfco = $PerfCounterName
#third argument switches debug mode, if 1 is passed, debug events will be logged to the operationsmanager eventlog on the agent, every other value will disable debug mode
$debugm = $DebugMode

#Log an event that our script is starting
if ($debugm -eq 1) {$api.LogScriptEvent(„DO-Clusterdisk-Performance.ps1″,70,0,“Collecting Perfcounter started for ClusterDisk: $ClusterDisk, Debugmode: $DebugMode“)}

#get the serialnumber for the clusterdisk
$colClusterDisk = Get-WmiObject -Namespace „rootMSCluster“ -class „MSCluster_DiskPartition“ | where {$_.Path -eq $drive}
Foreach ($objClusterDisk in $colClusterDisk) {
$volumelabel = $objClusterDisk.VolumeLabel
$serialnumber = $objClusterDisk.SerialNumber
if ($debugm -eq 1) {$api.LogScriptEvent(„DO-Clusterdisk-DiscPerformance.ps1″,70,0,“Clusterdisk serialnumber: $SerialNumber Clusterdisk volumelabel: $volumelabel“)}
}

#get the assosiated Win32_Volume object by the serialnumber
$colLogicalDiskTemp = Get-WmiObject Win32_Volume | Where { $_.serialnumber -eq $serialnumber}
Foreach ($objLogicalDiskTemp in $colLogicalDiskTemp) {
$drive = $objLogicalDiskTemp.Name
$drive = $drive.substring(0,$drive.length-1)
if ($debugm -eq 1) {$api.LogScriptEvent(„DO-Clusterdisk-Performance.ps1″,70,0,“Drive: $drive“)}
}

#get the performancecounter for the volume
$colLogicalDisk = Get-WmiObject -Query „Select * from Win32_perfformatteddata_perfdisk_LogicalDisk“ | where {$_.name -eq $drive}
Foreach ($objLogicalDisk in $colLogicalDisk) {
if ($strperfco -eq „DiskWritesPerSec“) {
$perf = $objLogicalDisk.DiskWritesPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Writes / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Writes / sec: $perf“
}

if ($strperfco -eq „DiskReadsPerSec“) {
$perf = $objLogicalDisk.DiskReadsPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Reads / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Reads / sec: $perf“
}

if ($strperfco -eq „DiskTransfersPerSec“) {
$perf = $objLogicalDisk.DiskTransfersPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Transfers / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Transfers / sec: $perf“
}

if ($strperfco -eq „DiskWriteBytesPerSec“) {
$perf = $objLogicalDisk.DiskWriteBytesPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Write Bytes / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Write Bytes / sec: $perf“
}

if ($strperfco -eq „DiskReadBytesPerSec“) {
$perf = $objLogicalDisk.DiskReadBytesPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Read Bytes / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Read Bytes / sec: $perf“
}

if ($strperfco -eq „DiskBytesPerSec“) {
$perf = $objLogicalDisk.DiskBytesPerSec
$bag = $api.CreatePropertyBag()
$bag.AddValue(„PerfCounter“,“Disk Bytes / sec“)
$bag.AddValue(„PerfValue“,[UInt32]$Perf)
$bag
$strperf = „`r`nDisk Bytes / sec: $perf“
}
if ($debugm -eq 1) {$api.LogScriptEvent(„DO-Clusterdisk-Performance.ps1″,70,0,“Drive: $drive $strperf“)}

[/code]

 

Mit dem Managementpack können wir nun wieder die Performancewerte der SQL-Cluster auswerten, auch im Reporting.

Performancewerte der Clusterdisks in der Konsole
Performancewerte der Clusterdisks in der Konsole
Performancewerte der Clusterdisks im Reporting
Performancewerte der Clusterdisks im Reporting

Damit gibt es endlich eine lang ersehnte Lösung für die fehlenden Performancewerte von Clusterdisks.

 

Weiteres