EessÔna
Kasutajad, arendajad ja MS SQL Serveri andmebaasi administratorid seisavad sageli silmitsi andmebaasi vÔi SQL Serveri tervikuna jÔudlusprobleemidega, seega on MS SQL Serveri jÀlgimine vÀga oluline.
See artikkel on lisaks artiklile ja kÀsitleb mÔningaid aspekte MS SQL Serveri jÀlgimisest, sealhulgas: kuidas kiiresti mÀÀrata, millest ressursse puudu jÀÀb, samuti soovitusi jÀlgimislipukeste seadistamiseks.
Allpool toodud skripti kasutamiseks tuleb luua inf skeem vajalikus andmebaasis jÀrgmiselt:
Inf skeemi loomine
use ;
go
create schema inf;
Meetod operatiivmÀlu puuduse tuvastamiseks
Esimene nÀitaja operatiivmÀlu puudusest on see, kui MS SQL Server tarvitab kogu talle eraldatud RAM-i.
Selleks loome jÀrgmise vaate inf.vRAM:
Inf.vRAM vaate loomine
CREATE view [inf].[vRAM] as
select a.[TotalAvailOSRam_Mb] -- kui palju RAM-i on serveris MB-s vaba
, a.[RAM_Avail_Percent] -- protsent vaba RAM-i serveris
, a.[Server_physical_memory_Mb] -- kui palju RAM-i on serveris MB-s kokku
, a.[SQL_server_committed_target_Mb] -- kui palju RAM-i on MS SQL Serverile MB-s eraldatud
, a.[SQL_server_physical_memory_in_use_Mb] -- kui palju RAM-i MS SQL Server hetkel MB-s tarvitab
, a.[SQL_RAM_Avail_Percent] -- protsent vaba RAM-i MS SQL Serverile vÔrreldes kogu eraldatud RAM-iga
, a.[StateMemorySQL] -- kas MS SQL Serverile piisab RAM-ist
, a.[SQL_RAM_Reserve_Percent] -- protsent RAM-ist, mis on MS SQL Serverile eraldatud vÔrreldes kogu RAM-iga serveris
-- kas serveril on piisavalt RAM-i
, (case when a.[RAM_Avail_Percent]5 and a.[TotalAvailOSRam_Mb]<8192 then 'Warning' when a.[RAM_Avail_Percent]<=5 and a.[TotalAvailOSRam_Mb]<2048 then 'Danger' else 'Normal' 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 'Warning' else 'Normal' 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;
Siis saab mÀÀrata, et MS SQL Serveri eksemplar kasutab kogu mÀÀratud mÀlu jÀrgmise pÀringu kaudu:
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, tuleb kontrollida ootamisstatistikat.
Ootamisstatistika kaudu RAM-i puuduse mÀÀramiseks loome vaate inf.vWaits:
Vaate inf.vWaits loomine
LOO view [inf].[vWaits] as
WITH [Waits] AS
(SELECT
[wait_type], --oote ootmise tĂŒĂŒp
[wait_time_ms] / 1000.0 AS [WaitS],--Oote aja kogus selle tĂŒĂŒbi korral millisekundites. See aeg sisaldab signal_wait_time_ms
([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],--Oote aja kogus selle tĂŒĂŒbi korral millisekundites ilma signal_wait_time_ms
[signal_wait_time_ms] / 1000.0 AS [SignalS],--Erinevus signaalimise ootevoo ja selle tÀitmise alguse aja vahel
[waiting_tasks_count] AS [WaitCount],--Ootete arvu selle tĂŒĂŒbi puhul. See loendur suureneb iga kord, kui ootus 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],--Oote aja kogus selle tĂŒĂŒbi korral millisekundites. See aeg sisaldab signal_wait_time_ms
CAST ([W1].[ResourceS] AS DECIMAL (16, 2)) AS [Resource_S],--Oote aja kogus selle tĂŒĂŒbi korral millisekundites ilma signal_wait_time_ms
CAST ([W1].[SignalS] AS DECIMAL (16, 2)) AS [Signal_S],--Erinevus signaalimise ootevoo ja selle tÀitmise alguse aja vahel
[W1].[WaitCount] AS [WaitCount],--Ootete arvu selle tĂŒĂŒbi puhul. See loendur suureneb iga kord, kui ootus 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 lÀvi
)
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];
Sellise juhtumi korral saab mÀlu puudumise mÀÀramiseks kasutada jÀrgmist pÀringut:
SELECT [Percentage]
,[AvgWait_S]
FROM [inf].[vWaits]
where [WaitType] in (
'PAGEIOLATCH_XX',
'RESOURCE_SEMAPHORE',
'RESOURCE_SEMAPHORE_QUERY_COMPILE'
);
Siin tuleks pöörata tĂ€helepanu nĂ€itajatele Percentage ja AvgWait_S. Kui need on oma kogusumma poolest olulised, tuleb tĂ”enĂ€oliselt MS SQL Serveri instantsil mĂ€lu defitsiit. Olulisi vÀÀrtusi mÀÀratakse igas sĂŒsteemis individuaalselt. Siiski, alguses vĂ”ib lĂ€htuda jĂ€rgmistest nĂ€itajatest: Percentage>=1 ja AvgWait_S>=0.005.
Tulemuste edastamiseks jĂ€lgimissĂŒsteemi (nĂ€iteks Zabbix) saab luua jĂ€rgmised kaks pĂ€ringut:
- kui suur osa ootustest röövib OZM-i (%):
select coalesce(sum([Percentage]), 0.00) as [Percentage] from [inf].[vWaits] where [WaitType] in ( 'PAGEIOLATCH_XX', 'RESOURCE_SEMAPHORE', 'RESOURCE_SEMAPHORE_QUERY_COMPILE' ); - kui kaua ootuste tĂŒĂŒbid viibivad OZM-i (kĂ”rgeim keskmine viivitus kĂ”igi selliste ootuste tĂŒĂŒpide seas) ms:
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' );
Saadud nĂ€itajate dĂŒnaamika pĂ”hjal saab teha jĂ€reldusi, kas MS SQL Serveri instantsil on piisavalt OZM-i.
Meetod protsessorikoormuse tuvastamiseks
Protsessoriaja puuduse tuvastamiseks on piisav kasutada sĂŒsteemivaadet sys.dm_os_schedulers. Siin, kui runnable_tasks_count nĂ€itaja on pidevalt suurem kui 1, on suur tĂ”enĂ€osus, et CPU tuumade arv on MS SQL Serveri instantsile ebapiisav.
NĂ€itajate edastamiseks jĂ€lgimissĂŒsteemi (nĂ€iteks Zabbix) saab luua jĂ€rgmise pĂ€ringu:
select max([runnable_tasks_count]) as [runnable_tasks_count]
from sys.dm_os_schedulers
where scheduler_id<255;
Saadud nĂ€itajate dĂŒnaamika pĂ”hjal saab teha jĂ€reldusi, kas protsessoriaega (CPU tuumade arvu) on piisavalt MS SQL Serveri instantsile.
Siiski on oluline meeles pidada, et pÀringud vÔivad samal ajal nÔuda mitut töövoogu. Ja mÔnikord ei suuda optimeerija Ôigesti hinnata pÀringu keerukust. Sellisel juhul vÔib pÀringule mÀÀrata liiga palju töövooge, mida ei saa hetkel samal ajal töödelda. See pÔhjustab samuti ooteaega, mis on seotud protsessoriaja puudumisega, ning jÀrjekordade kasvamine planeerijates, mis kasutavad konkreetseid CPU tuumasid, seega sellistes tingimustes suureneb runnable_tasks_count.
Sel juhul, enne CPU tuumade arvu suurendamist, on oluline Ôigesti seadistada MS SQL Serveri eksemplari paralleelsuse omadused ning alates 2016. aastast Ôigesti seadistada vajalike andmebaaside paralleelsuse omadused:


Siin tasub pöörata tÀhelepanu jÀrgmistele parameetritele:
- Max Degree of Parallelism - mÀÀrab maksimaalse töövoogude arvu, mis vĂ”ib iga pĂ€ringu jaoks olla eraldatud (vaikimisi on 0 - piirang ainult operatsioonisĂŒsteemile ja MS SQL Serveri vĂ€ljaandele).
- Cost Threshold for Parallelism - hinnanguline paralelsuse maksumus (vaikimisi on 5).
- Max DOP - mÀÀrab maksimaalse töövoogude arvu, mis vĂ”ib iga pĂ€ringu jaoks andmebaasi tasemel olla eraldatud (kuid mitte rohkem kui vÀÀrtus 'Max Degree of Parallelism' omadusest) (vaikimisi on 0 - piirang ainult operatsioonisĂŒsteemile ja MS SQL Serveri vĂ€ljaandele ning piirang 'Max Degree of Parallelism' kogu MS SQL Serveri eksemplari kohta).
Siin ei saa anda ĂŒhesugust head retsepti kĂ”igi juhtumite jaoks, seega tuleb analĂŒĂŒsida keerulisi pĂ€ringuid.
Oma kogemuste pĂ”hjal soovitan jĂ€rgmist tegevusalgoritmi OLTP-sĂŒsteemide paralleelsuse seadistamiseks:
- esimese sammu raames keelata paralleelsus, seades kogu eksemplari tasemel Max Degree of Parallelism 1-le.
- analĂŒĂŒsige kĂ”ige keerukamaid pĂ€ringuid ja valige nende jaoks optimaalse töövoogude arvu.
- seadke Max Degree of Parallelism valitud optimaalsele töövoogude arvule, saadud punktist 2, ning samuti seadke konkreetsete andmebaaside jaoks Max DOP vÀÀrtus, mis on saadud punktist 2 igale andmebaasile.
- analĂŒĂŒsige kĂ”ige keerukamaid pĂ€ringuid ja tuvastage negatiivne mĂ”ju mitme töövoo kasutamisest. Kui see esineb, siis suurendage Cost Threshold for Parallelism.
Selliste sĂŒsteemide nagu 1C, Microsoft CRM ja Microsoft NAV puhul sobib enamikul juhtudel mitme töövoo keelamine.
Samuti, kui on valitud Standard vĂ€ljaanne, sobib enamikul juhtudel protsessorite mitmeĂŒhtlustamise keelamine, kuna see vĂ€ljaanne on piiratud protsessorituumade arvu poolest.
OLAP-sĂŒsteemide jaoks ei sobi eespool kirjeldatud algoritm.
Oma kogemuste pĂ”hjal soovitan jĂ€rgmist tegevusjĂ€rgestust OLAP-sĂŒsteemide puhul paralleelsuse seadete seadmiseks:
- analĂŒĂŒsige kĂ”ige keerukamaid pĂ€ringuid ja valige nende jaoks optimaalse töövoogude arvu.
- seada Max Degree of Parallelism vÀlja valitud optimaalseks kiiruskoefitsiendiks, mis on saadud p.1-st, ja mÀrkida konkreetsetele andmebaasidele Max DOP vÀÀrtus, mis on saadud p.1 iga andmebaasi jaoks
- analĂŒĂŒsida kĂ”ige raskemaid pĂ€ringuid ja tuvastada negatiivne mĂ”ju paralleelsuse piiramisega. Kui see esineb, vĂ€hendada kas Cost Threshold for Parallelism vÀÀrtust vĂ”i korrata samme 1-2 selles algoritmis
Seega liikuda OLTP-sĂŒsteemide puhul ĂŒheltĂŒĂŒbist mitmeĂŒhtlustamise suunas ja OLAP-sĂŒsteemide puhul vastupidi â mitmeĂŒhtlustamisest ĂŒheĂŒhtlustamiseni. Nii saab seadistada optimaalsed paralleelsuse seaded nii konkreetse andmebaasi kui ka kogu MS SQL Serveri nĂ€ite jaoks.
Samuti on oluline mÔista, et paralleelsuse seadete muutmine on vajalik ajas, tuginedes MS SQL Serveri jÔudluse jÀlgimise tulemustele.
Soovitused jÀlgimislipude seadmiseks
Oma kogemuste ning kolleegide kogemuste pÔhjal soovitan MS SQL Serveri teenuse kÀivitamisel 2008-2016 versioonide jaoks seadistada jÀrgmised jÀlgimislipud:
- 610 â Indekseeritud tabelitesse sisestamise protokollimise vĂ€hendamine. See vĂ”ib aidata tabelitesse, kus on palju kirjeid ja palju tehinguid, pĂ€ringute osas, kui on sageli pikki ootusi WRITELOG-i tĂ”ttu indeksites muutumiste osas.
- 1117 â Kui fail vastab automaatse suurendamise kĂŒnnise nĂ”uetele, suurendatakse kĂ”iki faile failigruppides.
- 1118 â Paneb kĂ”ik objektid asuma erinevatesse ekstentidesse (segatud ekstentide keelamine), minimeerides SGAM lehe skanimeerimise vajadust, mida kasutatakse segatud ekstentide jĂ€lgimiseks.
- 1224 â Keelab lukustuste agregatsiooni lukustuste arvu pĂ”hjal. Kuid liiga aktiivne mĂ€lu kasutamine vĂ”ib aktiveerida lukustuste agregatsiooni.
- 2371 â Muudab staatilisi automaatsete statistika vĂ€rskenduste lĂ€ve dĂŒnaamiliste automaatsete statistika vĂ€rskenduste lĂ€ve. Oluline on pĂ€ringute plaanide vĂ€rskendamiseks suurte tabelitega, kus vale ridade arv viib vale tĂ€itmisplaanideni.
- 3226 â Vaikimisi pĂ€ringute varukoopiate edukas tĂ€itmine ei kajastu vealogis.
- 4199 â LĂŒlitab sisse pĂ€ringute optimeerija muudatused, mis on vĂ€lja antud kogumite vĂ€rskendustes ja SQL Serveri vĂ€rskenduspakettides.
- 6532-6534 â Parandab pĂ€ringute operatsioonide jĂ”udlust, kui kasutatakse ruumilisi andmetĂŒĂŒpe.
- 8048 â Muudab NUMA jĂ€rgi jaotatud mĂ€lobjektid CPU jĂ€rgi jaotatuks.
- 8780 â Aktiveerib tĂ€iendava aja eraldamise pĂ€ringute plaani koostamiseks. MĂ”ned pĂ€ringud, millel puudub see lipp, vĂ”ivad olla tagasi lĂŒkatud, kuna neil pole pĂ€ringute plaani (vĂ€ga harv viga).
- 8780 â 9389 â Aktiveerib tĂ€iendava dĂŒnaamiliselt eraldatud mĂ€lu puhvrina pakettreĆŸiimi operaatoritele, vĂ”imaldades pakettreĆŸiimi operaatoril kĂŒsida tĂ€iendavat mĂ€lu ja vĂ€ltida andmete edastamist tempdb-sse, kui tĂ€iendav mĂ€lu on saadaval.
Samuti on enne 2016. aastat kasulik aktiveerida jÀlgimislipu 2301, mis vÔimaldab tÀiustatud otsustusprotsessi optimeerimist ning seelÀbi toetab Ôigete pÀringute plaanide valikut. Siiski, alates 2016. aastast on sellel sageli negatiivne mÔju pÀringute kogutÀitevatele aegadele.
Samuti soovitan sĂŒsteemides, kus on vĂ€ga palju indekseid (nt 1C andmebaaside jaoks), aktiveerida jĂ€lgimislipu 2330, mis keelab indeksi kasutamise kogumise, mis ĂŒldiselt mĂ”jutab sĂŒsteemi positiivselt.
JĂ€lgimislipu kohta leiate rohkem teavet.
Ălaltoodud lingilt on oluline arvesse vĂ”tta ka MS SQL Serveri versioone ja kogusid, kuna uuemate versioonide puhul on mĂ”ned jĂ€lgimislipud vaikimisi lubatud vĂ”i ei oma mingit mĂ”ju.
JÀlgimislipu lubamine ja keelamine on vÔimalik DBCC TRACEON ja DBCC TRACEOFF kÀskude abil vastavalt. TÀiendav teave on saadaval.
JÀlgimislipu staatust saab vaadata DBCC TRACESTATUS kÀsu kaudu:
Ettevalmistamiseks MS SQL Serveri teenuse automaatseks kÀivitamiseks tuleb avada SQL Serveri konfiguratsioonihaldur ja teenuse omadustes lisada jÀlgimislipud lÀbi -T:

Summary
Selles artiklis kĂ€sitletakse mĂ”ned aspektid MS SQL Serveri monitooringust, mille abil vĂ”ib kiiresti tuvastada mĂ€lupuuduse ja CPU vabade ajavahemike puuduse, samuti mitmeid vĂ€hem ilmseid probleeme. Enimkasutatud jĂ€lgimislipud on ĂŒlevaatusel.
Allikad:
»
»
»
»
»
»
»
Allikas: habr.com
