-- =================================================================================================================== -- SQLI-WIN-001: CPU-forbruget er højt i længere tid -- =================================================================================================================== -- Regel-id: SQLI-WIN-001 -- Titel: CPU-forbruget er højt i længere tid -- Alvor: High; Critical når gennemsnittet er 98 % eller derover. -- Versioner: Windows Server 2008 R2 og nyere (WS-Man fra Windows Server 2012 / WinRM 3.0; DCOM på alle). -- -- Hvad tjekkes, og hvorfor: -- Serverens processorer har i gennemsnit været næsten fuldt belastet i en længere periode. Alt på serveren bliver -- langsommere (forespørgsler, AOS-kald, fildeling, logon). Korte toppe er normale og giver intet fund. -- -- Vurdering (sker i C# ud fra de indsamlede data, ikke på den overvågede server): -- Hvert minut læses tælleren Processor(_Total)\% Processor Time som rå værdi. CPU for minuttet er -- 100 × (1 − Δ tomgangstid / Δ tid) mellem to læsninger (PERF_100NSEC_TIMER_INV), altså gennemsnittet over hele -- minuttet, ikke et øjebliksbillede. Er gennemsnittet af minutterne i de seneste SustainedMinutes minutter mindst -- HighPercent, er det et fund. Uden to læsninger endnu: "ikke målbar". -- -- Grænseværdier (agentens appsettings.json): -- SQLInsight:Servers:Cpu:HighPercent standard 90 (gennemsnitlig CPU i procent) -- SQLInsight:Servers:Cpu:SustainedMinutes standard 15 (perioden gennemsnittet tages over) -- Målingerne skal dække mindst 80 % af perioden (en kort top efter et hul tæller ikke). -- -- Rettigheder på den overvågede server (db/permissions/grant-windows-server.ps1, aldrig lokal administrator): -- Performance Monitor Users (ydelsestællere) + WMI Enable Account/Remote Enable på root\cimv2 -- WS-Man: Remote Management Users · DCOM: Distributed COM Users -- -- Data kommer fra (collector, fil – medlemmer, interval): -- src/SQLInsight.Servers/CimWindowsServerSource.cs – Session.GetPerformanceAsync (CimQueries.ProcessorQuery), -- hvert minut (SQLInsight:Servers:Intervals:performance) fra src/SQLInsight.Agent/Servers/ServerMonitor.cs – CollectPerformanceAsync. -- Beregning: src/SQLInsight.Core/Servers/ServerPerformance.cs – ServerPerformanceMath.Cpu. -- Regelkode: src/SQLInsight.Rules/Servers/WindowsServerRules.cs : ServerCpuRule -- -- Read-only: Ja. Reglen sender ingen SQL. Agenten læser kun fra Windows: CIM/WQL-forespørgsler (SELECT), -- hændelsesloggen og for planlagte opgaver Task Schedulers skrivebeskyttede GetInfo. Den starter, stopper -- eller ændrer intet på serveren. Filen indeholder kun kommentarer; forespørgslerne mod Windows står herunder. -- =================================================================================================================== -- Reglen bruger ikke SQL. Forespørgslerne mod Windows står herunder; filen indeholder kun kommentarer og ændrer intet. -- -- CIM/WQL (namespace root\cimv2): -- SELECT PercentProcessorTime, Timestamp_Sys100NS FROM Win32_PerfRawData_PerfOS_Processor WHERE Name = '_Total' -- SELECT NumberOfLogicalProcessors FROM Win32_ComputerSystem -- -- Efterprøv med PowerShell (skrivebeskyttet; kør på agentens server som agentens konto): -- $s = New-CimSession -ComputerName SERVER # DCOM: -SessionOption (New-CimSessionOption -Protocol Dcom) -- $q = "SELECT PercentProcessorTime, Timestamp_Sys100NS FROM Win32_PerfRawData_PerfOS_Processor WHERE Name = '_Total'" -- $a = Get-CimInstance -CimSession $s -Query $q; Start-Sleep -Seconds 60; $b = Get-CimInstance -CimSession $s -Query $q -- 100 * (1 - ($b.PercentProcessorTime - $a.PercentProcessorTime) / ($b.Timestamp_Sys100NS - $a.Timestamp_Sys100NS))