-- =================================================================================================================== -- SQLI-SYN-002: Et syntetisk tjek svarer langsomt -- =================================================================================================================== -- Regel-id: SQLI-SYN-002 -- Titel: Et syntetisk tjek svarer langsomt -- Alvor: Medium. -- Versioner: Som SQLI-SYN-001. -- -- Hvad tjekkes, og hvorfor: -- Tjekket lykkes, men svaret har de seneste gange taget længere end tjekkets grænse. Brugerne oplever det som en langsom -- applikation, længe før den holder op med at svare. -- -- Vurdering (sker i C# ud fra de indsamlede data, ikke på den overvågede server): -- Er de seneste SlowRunsBeforeFinding kørsler alle lykkedes og alle langsommere end grænsen, er det et fund. -- -- Grænseværdier (agentens appsettings.json og tjekkets indstillinger): -- Pr. tjek: "Langsomt svar over (ms)" (insight.SyntheticChecks.SettingsJson: warnMilliseconds). Uden grænse: "ikke relevant". -- SQLInsight:SyntheticChecks:SlowRunsBeforeFinding standard 3 (langsomme svar i træk før et fund) -- -- Rettigheder: -- Som SQLI-SYN-001. -- -- Data kommer fra (collector, fil – medlemmer, interval): -- src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs – SyntheticCheckRunner.RunAsync (DurationMs: hele tjekket, for -- SQL login + forespørgsel), fra src/SQLInsight.Agent/Servers/SyntheticCheckService.cs – RunCheckAsync. -- Regelkode: src/SQLInsight.Rules/Servers/SyntheticCheckRules.cs : SyntheticCheckSlowRule -- -- Read-only: Ja. Ved et SQL-tjek valideres forespørgslen som én skrivebeskyttet SELECT, både når tjekket gemmes og -- før hver kørsel (src/SQLInsight.Core/CustomRules/ReadOnlyQuery.cs), og den køres i en transaktion, der -- altid rulles tilbage. Andre typer tjek sender ingen SQL og ændrer intet. -- Kørsel: Kør i SSMS som tjekkets login. Hver GO er en separat kommando på samme forbindelse; ret [msdb] til -- tjekkets database, eller udelad USE, hvis tjekket ingen database har. -- =================================================================================================================== -- SQL: Et SQL-tjek kører præcis det samme som i SQLI-SYN-001 (svartiden er login plus forespørgsel): -- ------------------------------------------------------------------------------------------------------------------- -- SyntheticCheckRunner: SQL-tjekket (login, sessionsindstillinger, forespørgslen i en transaktion, der rulles tilbage) -- ------------------------------------------------------------------------------------------------------------------- -- Variant: Alle versioner: sættes på hver forbindelse, agenten åbner (også tjekkets) -- Kilde: SqlConnectionFactory.SessionSettings -- Kode: src/SQLInsight.Connectivity/SqlConnectionFactory.cs : SqlConnectionFactory.SessionSettings SET LOCK_TIMEOUT 5000; SET DEADLOCK_PRIORITY LOW; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; GO -- Variant: Kun når tjekket har en database (vist for msdb) -- Kilde: SyntheticCheckRunner.UseDatabaseSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.UseDatabaseSql(database) USE [msdb]; GO -- Variant: Alle versioner fra SQL Server 2005: før forespørgslen -- Kilde: SyntheticCheckRunner.BeginTransactionSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.BeginTransactionSql BEGIN TRANSACTION; GO -- Variant: Standardforespørgslen, når tjekket ikke har sin egen (en egen forespørgsel køres her i stedet, højst 10.000 rækker læses) -- Kilde: SyntheticCheckSettings.DefaultQuery -- Kode: src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs : SyntheticCheckSettings.DefaultQuery SELECT 1 GO -- Variant: Alle versioner fra SQL Server 2005: altid efter forespørgslen, også når den fejler -- Kilde: SyntheticCheckRunner.RollbackSql -- Kode: src/SQLInsight.Servers/Synthetic/SyntheticCheckRunner.cs : SyntheticCheckRunner.RollbackSql IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; GO -- Ikke-SQL-tjek, efterprøv svartiden med PowerShell (skrivebeskyttet): -- Measure-Command { Invoke-WebRequest -Uri https://ep.firma.local/ -UseDefaultCredentials -UseBasicParsing } | Select-Object TotalMilliseconds -- Measure-Command { Test-NetConnection -ComputerName aos01 -Port 2712 } | Select-Object TotalMilliseconds