doskias
Goto Top

Hohe CPU Auslastung bei Exchange 2016

Hallo zusammen,

normalerweise arbeitet Sonntags niemand bei uns. Letzten Sonntag wurden jedoch VMs migriert und dabei ist aufgefallen, dass der Exchange 2016 eine extrem hohe CPU-Last aufweiset. Dies hat das VCenter gemeldet. Leider hat der Kollege jetzt nicht direkt auf dem Exchange geschaut wer bzw. was es war, sondern mir nur einen Screenshot des Vcenters geschickt. Im Monitoring konnte ich dann sehen, dass sich das Bild jeden Sonntag einstellt. Es beginnt stehts zwischen 05:00 Uhr und 05:05 und endet dann gegen 01:00 Uhr am Folgetag, also Montag.
Außerhalb dieses Zeitfensters liegt die CPU Auslastung bei 2 bis 5 %, in diesem Zeitfenster zwischen 78% und 87%. Einzelne Peeks über 80 lösen im Monitoring keine Mail aus und da sich die Situation von selbst regelt, sind die Warnungen Montag wieder verschwunden.

An mir liegt es nun herauszufinden, warum die CPU-Auslastung so hoch ist, bzw. was dafür verantwortlich ist. Meine Vermutung ist ein Excahnge-Dienst der regelmäßig läuft, allerdings konnte ich keinen in der Konfiguration ausfindig machen. Die Exchange-Logs werden täglich aufgeräumt, wenn diese älter als 7 Tage sind. Das würde mit dem zeitlichen Intervall übereinstimmen, zumal Samstag um 22 Uhr (also 7 Stunden vorher) ein Vollbackup des Server läuft, allerdings startet das Skript um 05:30 Uhr und war am entsprechende Tag bereits nach 21 Sekunden erfolgreich abgeschlossen.
Auch eine Aktion in folge des Backup-Jobs kann ich ausschließen, denn das Backup war um 00:23 Uhr bereits erfolgreich durchgelaufen.
Windows Updates werden um 03:00 Uhr geprüft und bei Bedarf installiert, war aber am letzten Wochenende ebenfalls nicht der Fall, zumal sie dann bereits Samstags installiert worden wären.

Also wollte ich an einer anderen Stelle ansetzen und via PS einfach am Sonntag abfragen, welche Prozesse welche Auslastung verursachen. Das Monitoring kann mein PS-Skript starten, (wenn ich den Schwellenwert entsprechend anpasse). Allerdings scheitert es dann schon am Skript. ich habe hier im Forum und auf einigen MS-Websites folgendes gefunden:

$CPUPercent = @{
  Name = 'CPUPercent'  
  Expression = {
    $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
    [Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
  }
}

Get-Process | 
 Select-Object -Property Name, CPU, $CPUPercent, Description |
 Sort-Object -Property CPUPercent -Descending |
 Select-Object -First 4
Sah für mich erstmal gut aus, allerdings mit dem Problem, dass die Werte nicht stimmen. Zum einen habe ich laut Task-Manager grade 7 % Auslastung, das Skritp gibt aber 19% Windows-Explorer, 19 % Perfom. 15 % Taskmanager und 6 % PowerShell aus. Außerdem habe ich zum Testen die CPU unter Last gesetzt auf 98%. Das Tool hat teilweise bis 180 % ausgegeben. Unbefriedigend. Also hab ich weiter gesucht. Unser Monitoring Tool empfiehlt folgendes Skript

param(
[int]$minload
)
$processes=Get-WMIObject Win32_PerfFormattedData_PerfProc_Process | select IDProcess,Name,PercentProcessorTime | where { $_.Name -ne "_Total" -and $_.Name -ne "Idle"} | sort PercentProcessorTime -Descending  | select -first 1  
$topname=$Processes.Name
$topCPU=$Processes.PercentProcessorTime
$topdesc=(Get-Process -Id $Processes.IDProcess).Description
$result=$topCPU -as [string]
if ($topdesc.length -gt 0) {
$topname=$topdesc
}
$result=$result+":"+$topname  
if ($topCPU -lt $minload) {
$result="0:No process at or above $minload%"  
}
write-host $result
Das funktioniert, allerdings zeigt es nur den Prozess an, der die höchste CPU Nutzung hat. Also Dachte ich, ich kann ja darauf aufbauen und habe mit folgender Zeile experimentiert:
$processes=Get-WMIObject Win32_PerfFormattedData_PerfProc_Process | select IDProcess,Name,PercentProcessorTime | where { $_.Name -ne "_Total" -and $_.Name -ne "Idle"} | sort PercentProcessorTime -Descending| ? PercentProcessorTime -gt 0  
Aber auch hier bekomme ich keine vernünfgtigen Werte heraus. Das CPU-Test-Tool hat die CPU mit 96,6 % belastet, das Skript meldet als 583 als Wert zurück, bei 81% Auslastung ist der Wert 309, bei 66% Auslastung 138 und bei 76,4 % Auslastung ist er Wert 471. Eine Umrechnung ist hier also irgendwie erforderlich, komme aber an der Stelle nicht weiter.

Also dachte ich im nächsten Schritt: back to basic und habe versucht die Leistungsüberwachung (perfmon.exe) entsprechend zu konfigurieren. Allerdings gelingt es mir auch hier nur eine Aufzeichnung der Auslastung zu bekommen. Was mir auch hier fehlt ist eine Übersicht über die entsprechenden Prozesse, die die Auslastung generieren.

Ich weiß, dass sich die Auslastung der einzelnen Prozesse unterscheiden kann. Mir würde hier ein 5 oder auch 15 minütiger Stand ausreichen. Wenn ich alle 15 Minuten eine Abfrage mache, über 20 Stunden, dann habe ich am Ende auch 80 Messergebnisse. Die würden ja ausreichen um ungefähr die Prozesse zu ermitteln, die dafür verantwortlich sind. Vielleicht hab ich auch einfach was übersehen. Bin für jeden Tipp dankbar.

Gruß
Doskias

Content-Key: 1768033429

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

Printed on: April 19, 2024 at 22:04 o'clock