MÔned MS SQL Serveri jÀlgimise aspektid. Soovitused jÀlgimisflaggide seadistamiseks

EessÔna

Kasutajad, arendajad ja MS SQL Serveri andmebaasiadministraatorid puutuvad sageli kokku andmebaasi vĂ”i andmebaasisĂŒsteemi ĂŒldise jĂ”udluse probleemidega, seetĂ”ttu on MS SQL Serveri jĂ€lgimine ÀÀrmiselt oluline.
See artikkel on tÀienduseks artiklile Zabbixi kasutamine MS SQL Serveri andmebaasi jÀlgimiseks ja siin kÀsitletakse mÔningaid MS SQL Serveri jÀlgimise aspekte, sealhulgas: kuidas kiiresti kindlaks teha, milliseid ressursse vajatakse, ning soovitusi jÀlgimisflaggide seadistamiseks.
JÀrgmiste skriptide tööks on vajalik luua inf skeem soovitud andmebaasis jÀrgmiselt:
Inf skeemi loomine

use ;
go
create schema inf;

MĂ€lu puuduse tuvastamise meetod

Esimene nÀitaja mÀlu puudusest on see, kui MS SQL Serveri instants sööb kogu talle eraldatud RAM-i.
Selleks loome jÀrgmise vaate inf.vRAM:
Inf.vRAM vaate loomine

Loo vaade [inf].[vRAM] kui
select a.[TotalAvailOSRam_Mb]						--kui palju on serveris vabamÀlu MB-des
		 , a.[RAM_Avail_Percent]					--vaba mÀlu protsent serveris
		 , a.[Server_physical_memory_Mb]				--kui palju on serveris kokku mÀlu MB-des
		 , a.[SQL_server_committed_target_Mb]			--kui palju mÀlu on MS SQL Serverile eraldatud MB-des
		 , a.[SQL_server_physical_memory_in_use_Mb] 		--kui palju mÀlu kasutab MS SQL Server hetkel MB-des
		 , a.[SQL_RAM_Avail_Percent]				--MS SQL Serverile eraldatud mÀlu suhtes vaba mÀlu protsent
		 , a.[StateMemorySQL]						--kas MS SQL Serverile on piisavalt mÀlu
		 , a.[SQL_RAM_Reserve_Percent]				--MS SQL Serverile eraldatud mÀlu protsent serveri kogu mÀlust
		 --kas serverile on piisavalt mÀlu
		, (case when a.[RAM_Avail_Percent]<10 and a.[RAM_Avail_Percent]>5 and a.[TotalAvailOSRam_Mb]<8192 then 'Hoiatus' when a.[RAM_Avail_Percent]<=5 and a.[TotalAvailOSRam_Mb]<2048 then 'Oht' else 'Normaalne' end) as [StateMemoryServer]
	from
	(
		select cast(a0.available_physical_memory_kb/1024.0 as int) as TotalAvailOSRam_Mb
			 , cast((a0.available_physical_memory_kb/casT(a0.total_physical_memory_kb as float))*100 as numeric(5,2)) as [RAM_Avail_Percent]
			 , a0.system_low_memory_signal_state
			 , ceiling(b.physical_memory_kb/1024.0) as [Server_physical_memory_Mb]
			 , ceiling(b.committed_target_kb/1024.0) as [SQL_server_committed_target_Mb]
			 , ceiling(a.physical_memory_in_use_kb/1024.0) as [SQL_server_physical_memory_in_use_Mb]
			 , cast(((b.committed_target_kb-a.physical_memory_in_use_kb)/casT(b.committed_target_kb as float))*100 as numeric(5,2)) as [SQL_RAM_Avail_Percent]
			 , cast((b.committed_target_kb/casT(a0.total_physical_memory_kb as float))*100 as numeric(5,2)) as [SQL_RAM_Reserve_Percent]
			 , (case when (ceiling(b.committed_target_kb/1024.0)-1024)<ceiling(a.physical_memory_in_use_kb/1024.0) then 'Hoiatus' else 'Normaalne' end) as [StateMemorySQL]
		from sys.dm_os_sys_memory as a0
		cross join sys.dm_os_process_memory as a
		cross join sys.dm_os_sys_info as b
		cross join sys.dm_os_sys_memory as v
		) as a;

Seega saab mÀÀrata, et MS SQL Serveri eksemplar kasutab kogu talle mÀÀratud mÀlu jÀrgmise pÀringuga:

select SQL_server_physical_memory_in_use_Mb, SQL_server_committed_target_Mb
from [inf].[vRAM];

Kui SQL_server_physical_memory_in_use_Mb nÀitaja on pidevalt vÀiksem kui SQL_server_committed_target_Mb, tuleks kontrollida ootuste statistikat.
OperatiivmÀlu puuduse mÀÀramiseks ootuste statistika kaudu loome vaate inf.vWaits:
Vaate inf.vWaits loomine

LOO view [inf].[vWaits] as
WITH [Waits] AS
    (SELECT
        [wait_type], -- ootamise tĂŒĂŒbi nimi
        [wait_time_ms] / 1000.0 AS [WaitS],--Antud tĂŒĂŒbi ootamise koguaeg millisekundites. See aeg sisaldab signal_wait_time_ms
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],--Antud tĂŒĂŒbi ootamise koguaeg millisekundites ilma signal_wait_time_ms
        [signal_wait_time_ms] / 1000.0 AS [SignalS],--Erinevus ootava niidi signalisatsiooni lÔpu aja ja selle kÀivitamise alguse vahel
        [waiting_tasks_count] AS [WaitCount],--Ootavate arv antud tĂŒĂŒbi puhul. See loendur suureneb iga kord, kui ootamine algab
        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],--Antud tĂŒĂŒbi ootamise koguaeg millisekundites. See aeg sisaldab signal_wait_time_ms
	    CAST ([W1].[ResourceS] AS DECIMAL (16, 2)) AS [Resource_S],--Antud tĂŒĂŒbi ootamise koguaeg millisekundites ilma signal_wait_time_ms
	    CAST ([W1].[SignalS] AS DECIMAL (16, 2)) AS [Signal_S],--Erinevus ootava niidi signalisatsiooni lÔpu aja ja selle kÀivitamise alguse vahel
	    [W1].[WaitCount] AS [WaitCount],--Ootavate arv antud tĂŒĂŒbi puhul. See loendur suureneb iga kord, kui ootamine algab
	    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 -- protsendi kĂŒnnis
)
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];

Sell juhul saab mÀlukoha puudujÀÀgi tuvastada jÀrgmise pÀringuga:

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

Siin tuleb tĂ€helepanu pöörata nĂ€itajatele Percentage ja AvgWait_S. Kui need on oluliselt kĂ”rged, on vĂ€ga suur tĂ”enĂ€osus, et MS SQL Serveri nĂ€idis kannatab mĂ€lupuuduse all. Olulised vÀÀrtused mÀÀratakse individuaalselt igas sĂŒsteemis. Siiski vĂ”ib alustada jĂ€rgmistest nĂ€itajatest: Percentage>=1 ja AvgWait_S>=0.005.
JÀlgimistarkvarasse (nt Zabbix) nÀitajate edastamiseks vÔib luua jÀrgmised kaks pÀringut:

  1. kui suure protsendi ulatuses vĂ”tavad mĂ€lu ootustĂŒĂŒbid (kĂ”ikide selliste ootustĂŒĂŒpide summa):
    select coalesce(sum([Percentage]), 0.00) as [Percentage]
    from [inf].[vWaits]
           where [WaitType] in (
                'PAGEIOLATCH_XX',
                'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    
  2. kui palju kulub ootustĂŒĂŒpidele mĂ€lu (kĂ”rgeim vÀÀrtus kĂ”igi selliste ootuste keskmisest viivitustest):
    valige coalesce(max([AvgWait_S])*1000, 0.00) as [AvgWait_MS]
    from [inf].[vWaits]
           where [WaitType] in (
                'PAGEIOLATCH_XX',
                'RESOURCE_SEMAPHORE',
                'RESOURCE_SEMAPHORE_QUERY_COMPILE'
      );
    

VĂ”ttes arvesse nende kahe nĂ€itaja dĂŒnaamikat, vĂ”ib jĂ€reldada, kas MS SQL Serveri eksemplaril on piisavalt RAM-i.

Liigne koormuse tuvastamise meetod

Protsessorite aja puuduse tuvastamiseks piisab sĂŒsteemi vaate sys.dm_os_schedulers kasutamisest. Siin, kui nĂ€itaja runnable_tasks_count on pidevalt suurem kui 1, on suur tĂ”enĂ€osus, et tuumade arv ei ole MS SQL Serveri eksemplari jaoks piisav.
JĂ€lgimissĂŒsteemi (nĂ€iteks Zabbix) nĂ€itaja vĂ€ljastamiseks saab koostada jĂ€rgmise pĂ€ringu:

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

VĂ”ttes arvesse selle nĂ€itaja dĂŒnaamikat, vĂ”ib jĂ€reldada, kas protsessorite aeg (tuumade arv) on MS SQL Serveri eksemplari jaoks piisav.
Kuid on oluline meeles pidada, et pĂ€ringud vĂ”ivad samaaegselt nĂ”uda mitut voogu. Ja mĂ”nikord ei suuda optimeerija Ă”igesti hinnata pĂ€ringu enda keerukust. Sel juhul vĂ”ib pĂ€ringule mÀÀrata liiga palju vooge, mida ei saa samal ajal töödelda. See loob ka oote tĂŒĂŒbi, mis on seotud protsessorite aja puudumisega ning kasvava jĂ€rjekorraga planeerijatel, mis kasutavad konkreetseid CPU tuumasid, seega runnable_tasks_count nĂ€itaja sellistes tingimustes kasvab.
Sellisel juhul on enne, kui suurendada CPU tuumade arvu, vajalik Ôigesti seadistada MS SQL Serveri esinemise paralleelsuse omadused, ning alates 2016. aastast - Ôigesti seadistada vajalike andmebaaside paralleelsuse omadused:
MÔned MS SQL Serveri jÀlgimise aspektid. Soovitused jÀlgimisflaggide seadistamiseks

MÔned MS SQL Serveri jÀlgimise aspektid. Soovitused jÀlgimisflaggide seadistamiseks
Siin on tÀhelepanu pöörata jÀrgmistele parameetritele:

  1. Max Degree of Parallelism - mÀÀrab maksimaalse voogude arvu, mis vĂ”ivad igale pĂ€ringule eralduda (vaikimisi on see 0 - piirang ainult operatsioonisĂŒsteemilt ja MS SQL Serveri vĂ€ljaandest)
  2. Cost Threshold for Parallelism - paralleelsuse hindamisjÔud (vaikimisi on see 5)
  3. Max DOP mÀÀrab maksimaalse samaaegsete voogude arvu, mis vĂ”ivad olla mÀÀratud iga pĂ€ringu jaoks andmebaasi tasemel (kuid mitte rohkem kui "Max Degree of Parallelism" omaduse vÀÀrtus) (vaikimisi on see 0 - piirang ainult operatsioonisĂŒsteemile ja MS SQL Serveri vĂ€ljaandele, samuti kogu MS SQL Serveri eksemplari "Max Degree of Parallelism" omaduse piirang).

Siin ei ole vĂ”imalik anda ĂŒhte head retsepti kĂ”igi juhtumite jaoks, seega tuleb analĂŒĂŒsida keerulisi pĂ€ringuid.
Oma kogemusest soovitan jĂ€rgmist tegevusalgoritmi OLTP-sĂŒsteemide korral paralleelsuse omaduste seadistamiseks:

  1. algul piirata paralleelsust, seades kogu eksemplari tasemel Max Degree of Parallelism vÀÀrtuseks 1.
  2. analĂŒĂŒsida kĂ”ige keerulisemaid pĂ€ringuid ja valida nende jaoks optimaalse voogude arvu.
  3. seada Max Degree of Parallelism vastavalt valitud optimaalsele voogude arvule, mis saadakse punktist 2, samuti mÀÀrata iga andmebaasi jaoks Max DOP vÀÀrtus, mis saadakse punktist 2.
  4. analĂŒĂŒsida kĂ”ige keerulisemaid pĂ€ringuid ja tuvastada mitme voogude kasutamise negatiivne mĂ”ju. Kui see on olemas, siis tĂ”sta Cost Threshold for Parallelism.
    SĂŒsteemide nagu 1C, Microsoft CRM ja Microsoft NAV jaoks sobib enamikul juhtudel mitme ĂŒlesande keelamine.

Kui kasutatakse Standard vĂ€ljaannet, siis enamikus olukordades sobib mitme ĂŒlesande keelamine, arvestades, et see vĂ€ljaanne on CPU tuumade arvu osas piiratud.
OLAP-sĂŒsteemide jaoks ei sobi ĂŒlaltoodud algoritm.
Olen enda kogemuste pĂ”hjal soovitanud jĂ€rgmisi samme OLAP-sĂŒsteemide paralleelsuse seadistamiseks:

  1. analĂŒĂŒsida kĂ”ige keerulisemaid pĂ€ringuid ja valida nende jaoks optimaalse voogude arvu.
  2. seada Max Degree of Parallelism soovitatud optimaalseks lÔimearvuks, mis on saadud punktist 1, ning iga konkreetse andmebaasi jaoks seada Max DOP vÀÀrtus, mis on saadud punktist 1.
  3. analĂŒĂŒsida kĂ”ige raskemaid pĂ€ringuid ja tuvastada paralleelsuse piiramise negatiivne mĂ”ju. Kui see esineb, tuleks kas vĂ€hendada Cost Threshold for Parallelism vÀÀrtust vĂ”i korrata samme 1-2 selles algoritmis.

Seega OLTP-sĂŒsteemide puhul liigume ĂŒhesuunaliselt mitme ĂŒlesande suunast ĂŒhele ĂŒlesandele, samas kui OLAP-sĂŒsteemide puhul vastupidi - liigume mitme ĂŒlesande suunast ĂŒhele ĂŒlesandele. Nii saab seadistada optimaalsed paralleelsuse seadistused nii konkreetse andmebaasi kui ka kogu MS SQL Serveri nĂ€ite jaoks.
Samuti on oluline mÔista, et paralleelsuse omaduste seadistusi tuleb ajakohastada vastavalt MS SQL Serveri jÔudluse monitoorimise tulemustele.

Juhised jÀlgimislipukeste seadistamiseks

Oma ja kolleegide kogemuste pĂ”hjal soovitan MS SQL Serveri teenuse kĂ€ivitamisel versioonides 2008–2016 seada jĂ€rgmised jĂ€lgimislipukesed:

  1. 610 — VĂ€hendab indekseeritud tabelitesse lisamise logimist. See vĂ”ib aidata suurt arvu ja mitme tehinguga tabelitesse lisamisel, kui on sageli pikki ootamisi WRITELOG indeksite muutmise tĂ”ttu.
  2. 1117 — Kui fail failigrupp tĂ€idab automaatse suurendamise lĂ€vendi nĂ”udeid, suurenevad kĂ”ik failid failigruppides.
  3. 1118 — Sunnib kĂ”ik objektid asuma erinevatesse ulatustesse (segmenteerimise keelamine), mis vĂ€hendab lehe SGAM skaneerimise vajadust, mida kasutatakse segmenteeritud ulatuste jĂ€lgimiseks.
  4. 1224 — LĂŒlitab vĂ€lja plokkide suurendamise, mis pĂ”hineb plokkide arvul. Ent liiga aktiivne mĂ€lu kasutamine vĂ”ib aktiveerida plokkide suurendamise.
  5. 2371 — Muudab fikseeritud automaatse statistika vĂ€rskendamise lĂ€ve dĂŒnaamiliseks automaatseks statistika vĂ€rskendamiseks. Oluline suure tabeli pĂ€ringute plaanide vĂ€rskendamiseks, kus vale rekordite arvu mÀÀramine viib vale teostusplaanideni.
  6. 3226 — Supresseerib veateates edukas varundamise tĂ€itmise teated.
  7. 4199 — Aktiveerib muudatused pĂ€ringute optimeerijas, mis on vĂ€lja antud kogumipakettides ja SQL Serveri vĂ€rskendustes.
  8. 6532-6534 — Aktiveerib pĂ€ringute operatsioonide jĂ”udluse paranemise ruumiliste andmetĂŒĂŒpide puhul.
  9. 8048 — Muudab NUMA pĂ”hjal jagatud mĂ€l 객ìČŽd protsessori pĂ”hjal jagatud objektideks.
  10. 8780 — Aktiveerib tĂ€iendava aja eraldamise pĂ€ringute plaani koostamiseks. MĂ”ned pĂ€ringud vĂ”ivad ilma selle liputa olla tagasi lĂŒkatud, kuna neil puudub pĂ€ringu plaan (vĂ€ga haruldane viga).
  11. 8780 — 9389 — See includes an additional dynamically allocated memory buffer for batch mode operators, allowing the batch operator to request extra memory and avoid data transfer to tempdb when additional memory is available.

It's also advisable to include trace flag 2301 in versions prior to 2016, which enables optimization for advanced decision support, helping to choose more appropriate query plans. However, starting from version 2016, it often negatively impacts the overall execution time of queries.
For systems with a large number of indexes (e.g., for 1C databases), I recommend enabling trace flag 2330, which disables index usage collection, positively impacting the system overall.
For more details about the trace flags, you can learn more here. siit
In addition to the link provided above, it's important to consider the versions and builds of MS SQL Server, as in newer versions some trace flags are enabled by default or have no effect.
Selleks et sisse ja vĂ€lja lĂŒlitada jĂ€lgimise lipp, saab kasutada kĂ€ske DBCC TRACEON ja DBCC TRACEOFF vastavalt. TĂ€iendava teabe saamiseks vaadake siit
JÀlgimise lippude oleku saamiseks saab kasutada kÀsku DBCC TRACESTATUS: tÀiendavalt
Kuna jÀlgimise lipud peavad olema MS SQL Serveri teenuse automaatse kÀivitamise osaks, tuleb siseneda SQL Serveri konfiguratsioonihaldurile ja teenuse omadustes lisada need jÀlgimise lipud -T: kaudu.
MÔned MS SQL Serveri jÀlgimise aspektid. Soovitused jÀlgimisflaggide seadistamiseks

KokkuvÔte

Selles artiklis kĂ€sitleti MS SQL Serveri jĂ€lgimise mĂ”ningaid aspekte, mille abil saab kiiresti tuvastada mĂ€lu ja CPU vabade ressursside puudujÀÀgid ning mitmed teised vĂ€hem ilmseid probleeme. Ülevaates keskenduti kĂ”ige sagedamini kasutatavatele jĂ€lgimise lipudele.

Allikad:

» SQL Serveri ootamine statistika
» SQL Serveri ootamiste statistika vÔi palun öelge mulle, kus valutab
» SĂŒsteemne vaade sys.dm_os_schedulers
» Zabbixi kasutamine MS SQL Serveri andmebaasi jÀlgimiseks
» SQL eluviis
» JÀlgimise lipud
» sql.ru

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster