NÄgra aspekter av övervakning av MS SQL Server. Rekommendationer för att konfigurera spÄrningsflaggor

Förord

AnvÀndare, utvecklare och administratörer av MS SQL Server-databaser stöter ofta pÄ prestandaproblem med databas eller databashanteringssystem som helhet, vilket gör att övervakning av MS SQL Server Àr mycket aktuellt.
Denna artikel Àr ett komplement till artikeln AnvÀndningen av Zabbix för övervakning av databasen MS SQL Server och den kommer att ta upp vissa aspekter av övervakning av MS SQL Server, sÀrskilt: hur man snabbt identifierar vilka resurser som saknas, samt rekommendationer för att konfigurera spÄrningsflaggor.
För att köra de följande skripten Àr det nödvÀndigt att skapa schemat inf i den önskade databasen pÄ följande sÀtt:
Skapa schemat inf

anvÀnd <databasenamn>;
go
skapa schema inf;

Metod för att identifiera brist pÄ RAM

En första indikator pÄ brist pÄ RAM Àr det fall dÀr instansen av MS SQL Server anvÀnder all tilldelad RAM.
För detta ÀndamÄl ska vi skapa följande vy inf.vRAM:
Skapa vyn inf.vRAM

SKAPA vy [inf].[vRAM] som
vÀlj a.[TotalAvailOSRam_Mb]						-- hur mycket ledigt RAM finns pÄ servern i MB
		 , a.[RAM_Avail_Percent]					-- procent ledigt RAM pÄ servern
		 , a.[Server_physical_memory_Mb]				-- hur mycket totalt RAM finns pÄ servern i MB
		 , a.[SQL_server_committed_target_Mb]			-- hur mycket totalt RAM som har tilldelats till MS SQL Server i MB
		 , a.[SQL_server_physical_memory_in_use_Mb] 		-- hur mycket RAM som MS SQL Server anvÀnder för tillfÀllet i MB
		 , a.[SQL_RAM_Avail_Percent]				-- procent ledigt RAM för MS SQL Server i förhÄllande till hela det tilldelade RAM för MS SQL Server
		 , a.[StateMemorySQL]						-- Àr RAM tillrÀckligt för MS SQL Server
		 , a.[SQL_RAM_Reserve_Percent]				-- procent reserverat RAM för MS SQL Server i förhÄllande till hela RAM pÄ servern
		 -- Àr RAM tillrÀckligt för servern
		, (fall nÀr a.[RAM_Avail_Percent]<10 och a.[RAM_Avail_Percent]>5 och a.[TotalAvailOSRam_Mb]<8192 dÄ 'Varning' nÀr a.[RAM_Avail_Percent]<=5 och a.[TotalAvailOSRam_Mb]<2048 dÄ 'Risk' annars 'Normal' slut) som [StateMemoryServer]
	frÄn
	(
		vÀlj kasta(a0.available_physical_memory_kb/1024.0 som int) som TotalAvailOSRam_Mb
			 , kasta((a0.available_physical_memory_kb/casT(a0.total_physical_memory_kb som float))*100 som numerisk(5,2)) som [RAM_Avail_Percent]
			 , a0.system_low_memory_signal_state
			 , tak(b.physical_memory_kb/1024.0) som [Server_physical_memory_Mb]
			 , tak(b.committed_target_kb/1024.0) som [SQL_server_committed_target_Mb]
			 , tak(a.physical_memory_in_use_kb/1024.0) som [SQL_server_physical_memory_in_use_Mb]
			 , kasta(((b.committed_target_kb-a.physical_memory_in_use_kb)/casT(b.committed_target_kb som float))*100 som numerisk(5,2)) som [SQL_RAM_Avail_Percent]
			 , kasta((b.committed_target_kb/casT(a0.total_physical_memory_kb som float))*100 som numerisk(5,2)) som [SQL_RAM_Reserve_Percent]
			 , (fall nÀr (tak(b.committed_target_kb/1024.0)-1024)<tak(a.physical_memory_in_use_kb/1024.0) dÄ 'Varning' annars 'Normal' slut) som [StateMemorySQL]
		frÄn sys.dm_os_sys_memory som a0
		korskoppla sys.dm_os_process_memory som a
		korskoppla sys.dm_os_sys_info som b
		korskoppla sys.dm_os_sys_memory som v
	) som a;

DÄ kan vi faststÀlla att instansen av MS SQL Server konsumerar hela den tilldelade minnet med följande frÄga:

vÀlj  SQL_server_physical_memory_in_use_Mb,  SQL_server_committed_target_Mb
frÄn [inf].[vRAM];

Om indikatorn SQL_server_physical_memory_in_use_Mb konstant Àr mindre Àn SQL_server_committed_target_Mb, bör vi kontrollera vÀntestatistiken.
För att avgöra bristen pÄ RAM genom vÀntestatistik skapar vi vyn inf.vWaits:
Skapa vyn inf.vWaits

CREATE view [inf].[vWaits] as
WITH [Waits] AS
    (SELECT
        [wait_type], --namn pÄ vÀntetyp
        [wait_time_ms] / 1000.0 AS [WaitS],--Total vÀntetid för denna typ i millisekunder. Denna tid inkluderar signal_wait_time_ms
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],--Total vÀntetid för denna typ i millisekunder utan signal_wait_time_ms
        [signal_wait_time_ms] / 1000.0 AS [SignalS],--Skillnaden mellan signaleringstiden för den vÀntande trÄden och tiden för dess pÄbörjande
        [waiting_tasks_count] AS [WaitCount],--Antal vÀntningar för denna typ. Denna rÀknare ökar varje gÄng en vÀntan inleds
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
    FROM sys.dm_os_wait_stats
    WHERE [waiting_tasks_count]>0
		and [wait_type] NOT IN (
        N'BROKER_EVENTHANDLER',         N'BROKER_RECEIVE_WAITFOR',
        N'BROKER_TASK_STOP',            N'BROKER_TO_FLUSH',
        N'BROKER_TRANSMITTER',          N'CHECKPOINT_QUEUE',
        N'CHKPT',                       N'CLR_AUTO_EVENT',
        N'CLR_MANUAL_EVENT',            N'CLR_SEMAPHORE',
        N'DBMIRROR_DBM_EVENT',          N'DBMIRROR_EVENTS_QUEUE',
        N'DBMIRROR_WORKER_QUEUE',       N'DBMIRRORING_CMD',
        N'DIRTY_PAGE_POLL',             N'DISPATCHER_QUEUE_SEMAPHORE',
        N'EXECSYNC',                    N'FSAGENT',
        N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
        N'HADR_CLUSAPI_CALL',           N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'HADR_LOGCAPTURE_WAIT',        N'HADR_NOTIFICATION_DEQUEUE',
        N'HADR_TIMER_TASK',             N'HADR_WORK_QUEUE',
        N'KSOURCE_WAKEUP',              N'LAZYWRITER_SLEEP',
        N'LOGMGR_QUEUE',                N'ONDEMAND_TASK_QUEUE',
        N'PWAIT_ALL_COMPONENTS_INITIALIZED',
        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
        N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
        N'SERVER_IDLE_CHECK',           N'SLEEP_BPOOL_FLUSH',
        N'SLEEP_DBSTARTUP',             N'SLEEP_DCOMSTARTUP',
        N'SLEEP_MASTERDBREADY',         N'SLEEP_MASTERMDREADY',
        N'SLEEP_MASTERUPGRADED',        N'SLEEP_MSDBSTARTUP',
        N'SLEEP_SYSTEMTASK',            N'SLEEP_TASK',
        N'SLEEP_TEMPDBSTARTUP',         N'SNI_HTTP_ACCEPT',
        N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
        N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'SQLTRACE_WAIT_ENTRIES',       N'WAIT_FOR_RESULTS',
        N'WAITFOR',                     N'WAITFOR_TASKSHUTDOWN',
        N'WAIT_XTP_HOST_WAIT',          N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
        N'WAIT_XTP_CKPT_CLOSE',         N'XE_DISPATCHER_JOIN',
        N'XE_DISPATCHER_WAIT',          N'XE_TIMER_EVENT')
    )
, ress as (
	SELECT
	    [W1].[wait_type] AS [WaitType],
	    CAST ([W1].[WaitS] AS DECIMAL (16, 2)) AS [Wait_S],--Total vÀntetid för denna typ i millisekunder. Denna tid inkluderar signal_wait_time_ms
	    CAST ([W1].[ResourceS] AS DECIMAL (16, 2)) AS [Resource_S],--Total vÀntetid för denna typ i millisekunder utan signal_wait_time_ms
	    CAST ([W1].[SignalS] AS DECIMAL (16, 2)) AS [Signal_S],--Skillnaden mellan signaleringstiden för den vÀntande trÄden och tiden för dess pÄbörjande
	    [W1].[WaitCount] AS [WaitCount],--Antal vÀntningar för denna typ. Denna rÀknare ökar varje gÄng en vÀntan inleds
	    CAST ([W1].[Percentage] AS DECIMAL (5, 2)) AS [Percentage],
	    CAST (([W1].[WaitS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgWait_S],
	    CAST (([W1].[ResourceS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgRes_S],
	    CAST (([W1].[SignalS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgSig_S]
	FROM [Waits] AS [W1]
	INNER JOIN [Waits] AS [W2]
	    ON [W2].[RowNum] <= [W1].[RowNum]
	GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[WaitS],
	    [W1].[ResourceS], [W1].[SignalS], [W1].[WaitCount], [W1].[Percentage]
	HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95 -- procentgrÀns
)
SELECT [WaitType]
      ,MAX([Wait_S]) as [Wait_S]
      ,MAX([Resource_S]) as [Resource_S]
      ,MAX([Signal_S]) as [Signal_S]
      ,MAX([WaitCount]) as [WaitCount]
      ,MAX([Percentage]) as [Percentage]
      ,MAX([AvgWait_S]) as [AvgWait_S]
      ,MAX([AvgRes_S]) as [AvgRes_S]
      ,MAX([AvgSig_S]) as [AvgSig_S]
  FROM ress
  group by [WaitType];

I det hÀr fallet kan bristen pÄ RAM bestÀmmas med följande frÄga:

SELECT [Percentage]
      ,[AvgWait_S]
  FROM [inf].[vWaits]
  where [WaitType] in (
    'PAGEIOLATCH_XX',
    'RESOURCE_SEMAPHORE',
    'RESOURCE_SEMAPHORE_QUERY_COMPILE'
  );

HÀr bör man vara uppmÀrksam pÄ vÀrdena Percentage och AvgWait_S. Om de Àr betydande i sin helhet finns det en hög sannolikhet för att RAM inte rÀcker till för MS SQL Server-instansen. Betydande vÀrden bestÀms individuellt för varje system. Man kan dock börja med följande vÀrden: Percentage>=1 och AvgWait_S>=0.005.
För att visa vÀrdena i övervakningssystemet (till exempel Zabbix) kan följande tvÄ frÄgor skapas:

  1. hur mycket i procent som vÀntetyperna för RAM upptar (summan av alla sÄdana vÀntetyper):
    select coalesce(sum([Percentage]), 0.00) as [Percentage]
    from [inf].[vWaits]
           where [WaitType] in (
               'PAGEIOLATCH_XX',
               'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    
  2. hur mycket i millisekunder som vÀntetyperna för RAM upptar (det maximala vÀrdet av alla genomsnittliga förseningar för alla sÄdana vÀntetyper):
    select coalesce(max([AvgWait_S])*1000, 0.00) as [AvgWait_MS]
    from [inf].[vWaits]
           where [WaitType] in (
               'PAGEIOLATCH_XX',
               'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    

Baserat pÄ dynamiken i de erhÄllna vÀrdena för dessa tvÄ indikatorer kan man dra slutsatsen om RAM rÀcker till för MS SQL Server-instansen.

Metod för att upptÀcka överbelastning pÄ CPU

För att identifiera bristen pÄ processor-tid Àr det tillrÀckligt att anvÀnda systemvyn sys.dm_os_schedulers. HÀr, om vÀrdet pÄ runnable_tasks_count konstant Àr större Àn 1, finns det en stor sannolikhet för att antalet kÀrnor inte rÀcker för MS SQL Server-instansen.
För att visa vÀrdet i övervakningssystemet (till exempel Zabbix) kan följande frÄga skapas:

select max([runnable_tasks_count]) as [runnable_tasks_count]
from sys.dm_os_schedulers
where scheduler_id<255;

Baserat pÄ dynamiken i de erhÄllna vÀrdena för denna indikator kan man dra slutsatsen om processor-tid (antal CPU-kÀrnor) rÀcker till för MS SQL Server-instansen.
Det Àr dock viktigt att komma ihÄg att sjÀlva förfrÄgningarna kan begÀra flera trÄdar samtidigt. Ibland kan optimeraren inte korrekt bedöma komplexiteten hos sjÀlva förfrÄgan. DÄ kan förfrÄgningen tilldelas för mÄnga trÄdar som inte kan bearbetas samtidigt vid den tidpunkten. Detta leder ocksÄ till en typ av vÀntan, kopplad till bristen pÄ processorcykler och vÀxande köer pÄ schemalÀggarna som anvÀnder specifika CPU-kÀrnor, vilket innebÀr att indikatorn runnable_tasks_count under dessa förhÄllanden kommer att öka.
I sÄdana fall Àr det nödvÀndigt att korrekt konfigurera parallellismens egenskaper för instansen av MS SQL Server innan antalet CPU-kÀrnor ökas, och frÄn version 2016 mÄste man korrekt konfigurera parallellismens egenskaper för de nödvÀndiga databaserna:
NÄgra aspekter av övervakning av MS SQL Server. Rekommendationer för att konfigurera spÄrningsflaggor

NÄgra aspekter av övervakning av MS SQL Server. Rekommendationer för att konfigurera spÄrningsflaggor
HÀr bör man uppmÀrksamma följande parametrar:

  1. Max Degree of Parallelism - bestÀmmer maximalt antal trÄdar som kan tilldelas varje förfrÄgan (standardvÀrdet Àr 0 - begrÀnsat av operativsystemet och versionen av MS SQL Server)
  2. Cost Threshold for Parallelism - bedömningskostnaden för parallellism (standardvÀrdet Àr 5)
  3. Max DOP - bestÀmmer maximalt antal trÄdar som kan tilldelas varje förfrÄgan pÄ databasnivÄ (men inte mer Àn vÀrdet för "Max Degree of Parallelism") (standardvÀrdet Àr 0 - begrÀnsat av operativsystemet och versionen av MS SQL Server, samt begrÀnsningen för egenskapen "Max Degree of Parallelism" för hela instansen av MS SQL Server)

HÀr gÄr det inte att ge ett lika bra recept för alla fall, det vill sÀga man mÄste analysera tunga förfrÄgningar.
UtifrÄn egen erfarenhet rekommenderar jag följande handlingsplan för OLTP-system för att konfigurera parallellismens egenskaper:

  1. först förbjuda parallellism genom att stÀlla in Max Degree of Parallelism pÄ 1 för hela instansen
  2. analysera de tyngsta förfrÄgningarna och vÀlja det optimala antalet trÄdar för dem
  3. stÀll in Max Degree of Parallelism till det optimala antalet trÄdar som erhÄllits frÄn punkt 2, samt stÀll in Max DOP-vÀrdet för specifika databaser som erhÄllits frÄn punkt 2 för varje databas
  4. analysera de tyngsta förfrÄgningarna och identifiera den negativa effekten av flertrÄdighet. Om det finns en negativ effekt, öka Cost Threshold for Parallelism.
    För system som 1C, Microsoft CRM och Microsoft NAV passar det oftast att förbjuda flertrÄdighet.

Även om Standard-redigeringen Ă€r aktiverad, gĂ€ller det i de flesta fall att avaktivera multitrĂ„dad bearbetning pĂ„ grund av att denna redigering Ă€r begrĂ€nsad i antal CPU-kĂ€rnor.
För OLAP-system passar inte den ovan beskrivna algoritmen.
Enligt egen erfarenhet rekommenderar jag följande handlingsplan för OLAP-system för att stÀlla in instÀllningarna för parallellism:

  1. analysera de tyngsta förfrÄgningarna och vÀlja det optimala antalet trÄdar för dem
  2. StÀll in Max Degree of Parallelism till det optimala antalet trÄdar, som erhÄllits frÄn punkt 1, samt för specifika databaser stÀll in Max DOP-vÀrdet, som erhÄllits frÄn punkt 1, för varje databas.
  3. Analysera de mest resurskrÀvande frÄgorna och identifiera den negativa effekten av att begrÀnsa parallellism. Om det finns en negativ effekt, antingen sÀnka vÀrdet av Cost Threshold for Parallelism eller upprepa steg 1-2 i denna algoritm.

Det vill sÀga för OLTP-system gÄr vi frÄn entrÄdad bearbetning till multitrÄdad, medan vi i OLAP-system gÄr frÄn multitrÄdad bearbetning till entrÄdad. PÄ sÄ sÀtt kan vi optimera instÀllningarna för parallellism bÄde för specifika databaser och för hela MS SQL Server-instansen.
Det Àr ocksÄ viktigt att förstÄ att instÀllningarna för parallellismens egenskaper mÄste Àndras över tid, baserat pÄ resultaten av prestandamonitoreringen av MS SQL Server.

Rekommendationer för instÀllning av spÄrningsflaggor

UtifrÄn min egen erfarenhet och mina kollegors rekommenderar jag att ange följande spÄrningsflaggor vid start av MS SQL Server-tjÀnsten för versionerna 2008-2016:

  1. 610 - Minskar loggningen av insÀttningar i indexerade tabeller. Kan vara till hjÀlp för insÀttningar i tabeller med ett stort antal poster och mÄnga transaktioner, vid frekventa lÄnga vÀntetider för WRITELOG pÄ grund av förÀndringar i index.
  2. 1117 - Om en fil i filgruppen uppfyller kraven för automatisk ökning, ökas alla filer i filgruppen.
  3. 1118 - Tvingar alla objekt att placeras i olika extenter (förbud mot blandade extenter), vilket minimerar behovet av att skanna SGAM-sidan, som anvÀnds för att spÄra blandade extenter.
  4. 1224 - Inaktiverar uppgruppering av lÄs baserat pÄ antalet lÄs. Men om minnet anvÀnds för aktivt kan uppgruppering av lÄs aktiveras.
  5. 2371 - Ändrar tröskeln för fast automatisk uppdatering av statistik till tröskeln för dynamisk automatisk uppdatering av statistik. Viktigt för uppdatering av frĂ„geplaner relaterade till stora tabeller, dĂ€r felaktig bestĂ€mning av antalet poster leder till felaktiga exekveringsplaner.
  6. 3226 - Suppresserar meddelanden om lyckad sÀkerhetskopiering i felloggen.
  7. 4199 - Aktiverar Àndringar i frÄgeoptimeraren som slÀpptes i kumulativa uppdateringspaket och uppdateringspaket för SQL Server.
  8. 6532-6534 - Aktiverar prestandaförbÀttringar för frÄgeoperationer med rumsliga datatyper.
  9. 8048 - Omvandlar NUMA-delade minnesobjekt till CPU-delade.
  10. 8780 - Aktiverar ytterligare tidsallokering för att kompilera frÄgeplaner. Vissa frÄgor utan denna flagga kan avvisas, eftersom de saknar en frÄgeplan (mycket sÀllsynt fel).
  11. 8780 - 9389 - Aktiverar en ytterligare dynamisk temporÀrt tilldelad minnesbuffert för batch-operatorer, vilket gör det möjligt för batch-operatorer att begÀra ytterligare minne och undvika att data flyttas till tempdb, om ytterligare minne Àr tillgÀngligt.

Även fram till version 2016 Ă€r det bra att aktivera spĂ„rningsflaggan 2301, som aktiverar optimering av utökad beslutsstöd och dĂ€rigenom hjĂ€lper till med valet av mer korrekta frĂ„geplaner. Men frĂ„n version 2016 kan det ofta ha en negativ inverkan pĂ„ den totala exekveringstiden för frĂ„gor.
För system med mÄnga index (t.ex. för 1C-databaser) rekommenderar jag ocksÄ att aktivera spÄrningsflaggan 2330, som inaktiverar insamling av indexanvÀndning, vilket generellt har en positiv effekt pÄ systemet.
För mer information om spÄrningsflaggor kan du lÀsa mer. hÀr
Vid den angivna lÀnken Àr det ocksÄ viktigt att ta hÀnsyn till versioner och byggen av MS SQL Server, eftersom vissa spÄrningsflaggor Àr aktiverade som standard eller inte har nÄgon effekt i nyare versioner.
SpÄrningsflaggor kan aktiveras och inaktiveras med hjÀlp av kommandona DBCC TRACEON och DBCC TRACEOFF respektive. Se mer detaljer. hÀr
Du kan fÄ status pÄ spÄrningsflaggorna med kommandot DBCC TRACESTATUS: mer information
För att spÄrningsflaggor ska aktiveras för automatisk start av tjÀnsten MS SQL Server mÄste man gÄ till SQL Server Configuration Manager och i tjÀnstens egenskaper lÀgga till dessa spÄrningsflaggor via -T:
NÄgra aspekter av övervakning av MS SQL Server. Rekommendationer för att konfigurera spÄrningsflaggor

Sammanfattning

I denna artikel har vi diskuterat vissa aspekter av övervakning av MS SQL Server, med vars hjÀlp man snabbt kan identifiera brist pÄ RAM och tillgÀnglig CPU-tid samt andra mindre uppenbara problem. Vi har Àven gÄtt igenom de mest anvÀnda spÄrningsflaggorna.

KĂ€llor:

» SQL Server vÀntestatistik
» SQL Server vÀntestatistik eller snÀlla, sÀg mig var det gör ont
» Systemvy sys.dm_os_schedulers
» AnvÀndningen av Zabbix för övervakning av databasen MS SQL Server
» SQL livsstil
» SpÄrningsflaggor
» sql.ru

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster