Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdGert Meyer Laatst gewijzigd meer dan 10 jaar geleden
1
Mario Broodbakker mariob@sqlinternals.com
SQL Server Wait Events Mario Broodbakker
2
Bio DBA sinds 1987, eerst mainframe later, Oracle op AIX en Windows.
Performance & Benchmark specialist Baan 1997, later bij Compaq. Windows Oracle, SQL Server en Informix benchmarks. Compaq en HP: Unix, en Windows Oracle performance consultant. Windows Integrity Engineering: Windows Itanium (eh, Oracle) benchmarks in Redmond. In 2002 begonnen met reverse engineering SQL Server 2000 later 2005, om uitbreiding te maken voor wait event collecting. (per user sessie, wait event tracing). Zie: Artikelen over SQL Server waitstuff Sinds 2010: Database specialist bij PGGM: eindelijk SQL Server DBA!
3
Wat zijn wait events ? Als SQL Server niet aan het werk is, dan wacht hij. Dit is een wait event: er gebeurt ‘iets’ waardoor de huidige taak moet wachten. SQL Server vertelt waarom hij wacht: Data file of transaction log IO Network IO Locks & Latches CPU En meer dan 480 andere wait types
4
Wat heb ik eraan? R = S +W : Responsetijd = service time + wait time
Response tijd is voor de eindgebruiker waar het om gaat. ‘R’ kan zijn online response tijd, maar ook doorlooptijd voor batch verwerking. Voorbeeld: 4 seconden response tijd blijkt opgebouwd uit 0,2 s CPU tijd en 3,8 seconden IO tijd. Heeft het zin om CPU tijd proberen te optimaliseren? Snellere CPUs? Snellere code?
5
Een beetje historie Oracle wait events zijn sinds 1994 goed gedocumenteerd (Anjo Kolk), en hebben door de jaren heen hun waarde bewezen. YAPP: Yet Another Performance Profiling method paper. DBCC SQLPerf(Waitstats) niet gedocumenteerd: Gert Drapers en Tom Davidson waren de eersten. Pas in de BOL sinds SQL Server 2005 Microsoft papers: Troubleshooting Performance Problems using Queues and waits (SQL server 2005 en 2008) : Davidson ea.
6
Waar komen die wait events vandaan?
SOS Scheduler Verwerking van ‘work requests’ : een SQL Batch of een deel van een Parallel Query. -> task 1 task draait op 1 scheduler op 1 CPU totdat: Een blocking call plaats vindt: disk IO, network IO -> wait event wordt vastgelegd, start tijd en type. Tijd quantum op is (ter voorkoming van monopolisering van scheduler en dus CPU): SOS_SCHEDULER_WAIT (en SLEEP_TASK?) Werk van een task gebeurt door een worker thread: OS thread of Fiber (light weight pooling)
7
Verwerkings flow Runnable Running Suspended PreEmptive
(uit: SS2005 Practical Troubleshooting: Ken Henderson) Worker available Runnable Running New Task Pending Done Suspended PreEmptive
8
Wait time De wait time bestaat uit 2 componenten:
Resource wait time De tijd die het kost tot de resource vrij komt. De tijd tussen ‘suspended’ en ‘ runnable’ Signal wait time De tijd die het kost om weer gescheduled te worden na het vrijkomen van de resource. De tijd tussen ‘runnable’ en ‘running’. Wait time in DMVs is inclusief signal wait time. Resolutie van timing kan verschillen per SQL Server versie. Vanaf SS2005 SP3 vaak rond de 1ms..of beter (zie link voor uitgebreide info)
9
Waar te vinden Sys.dm_os_wait_stats (dbcc sqlperf(waitstats) ) (screenshot) Sinds startup, of dbcc sqlperf(sys.dm_os_wait_stats, clear) Wait time, Signal time (tijd: runnable->running) Sys.dm_os_waiting_tasks (screenshot) Sys.dm_exec_requests, Sysprocesses (screenshot) Sys.dm_io_virtual_file_stats(db_id,file_id) (screenshot) Io_stall_read_ms, Io_stall_write_ms en num_reads/writes. ‘echte’ IO tijd, let ook op num_of_bytes_read/written. Meestal 64K per read of meer! (zie screenshot: virtual filestats summary) Sys.dm_db_index_operational_stats(db_id,object_id,etc,..) (screenshot) Waar niet?! Profiler!
10
select wait_type,waiting_tasks_count,wait_time_ms,signal_wait_time_ms, wait_time_ms/waiting_tasks_count as 'avg wait ms' from sys.dm_os_wait_stats where waiting_tasks_count > 0 order by wait_time_ms desc
11
select session_id,exec_context_id,wait_duration_ms ,wait_type,resource_description from sys.dm_os_waiting_tasks order by session_id asc
12
Wait voorbeelden Pagiolatch_xx Pagelatch_xx
Wachten op een page van disk. Let op: dit is niet per se de IO tijd. Lange wacht tijden kunnen wijzen op IO problemen, kijk ook naar virtual file stats of perfmon counters. Pagelatch_xx Wachten op toegang tot een database page in memory. _UP types, meestal voor huishoud pages (PFS,GAM,SGAM) Latch_xx (zie volgende slide) Writelog (en logbuffer) Wachten op een transactie log write, vaak na commit. Logbuffer wait: wachten op ruimte in de logbuffer LCK_M_XX Row, key en page lock waits. Asynch_network_io Netwerk writes richting client: afhankelijk van verwerkingssnelheid van client (en netwerk latency)
13
Wait voorbeelden 2 Sos_scheduler_waits CXPACKET
Wachten op beschikbaarheid scheduler Paper over van ondergetekende op CXPACKET Synchronisatie tijdens Parallel Query, hoeft geen probleem te zijn. Erg goede presentatie: webcast2 SLEEP_TASK en IO_COMPLETION Sleep_task wordt soms gebruikt als ‘scheduler yield’, en soms gewoon als ‘sleep’. Als gezien samen met IO_completion, vaak gevolg van hash joins en sorts. Wederom: webcast1 CMEMTHREAD, RESOURCE_SEMAPHORE Plan caching/recompile problemen? Memory intensieve queries: grote sorts/hash joins Background waits: Lazywriter_sleep, sqltrace_buffer_flush, logmgr_queue (pas op voor Sleep_task! Lijkt meerdere gebruiken te kennen) PreEmptive waits Buiten scheduler om, bijvoorbeeld system calls of external stored procedures.
14
Latches Snelle (short-term) synchronisatie objecten
Sys.dm_os_latch_stats. Latch_class ‘BUFFER’ is som van PAGE% latches. Een aantal zijn gedocumenteerd in BOL ACCESS_METHODS_xx: gebruikt voor navigatie van indexes en heaps (SCAN/KEY_RANGE_GENERATOR: Parallel Query. Zie ook ‘SQL Broker trouble’ slides achterin.
15
tools Performance dashboard (screenshot), drildown tool met ‘current’ situatie. Management DW & Performance collector SQL Server 2008, uitbreidbaar DW voor performance info. SQLSTAT2005 (codeplex), houdt snapshots bij van de belangrijkste DMVs, en heeft PerfDashboard-achtige reports. (zie voorbeeld slide) Geen SQL Trace of Profiler ! (zucht) Xevents in SQL Server 2008 Eigen scripts: begin/end_waitstats (zie voorbeeld slides) GO USE [master] SET ANSI_NULLS ON /****** Object: StoredProcedure [dbo].[begin_waitstats] Script Date: 03/17/ :05:47 ******/ SET QUOTED_IDENTIFIER ON as CREATE proc [dbo].[begin_waitstats] if exists (select 1 set nocount on from sys.objects where object_id = object_id ( N'[dbo].[my_waitstats]') and drop table [dbo].[my_waitstats] begin OBJECTPROPERTY(object_id, N'IsUserTable') = 1) end where object_id = object_id ( N'[dbo].[my_cpustats]') and drop table [dbo].[my_cpustats] create table [dbo].[my_waitstats] [waiting_tasks_count] bigint not null, ([wait_type] nvarchar(60) not null, now datetime not null default getdate()) [signal_wait_time_ms] bigint not null, [wait_time_ms] bigint not null, (cpu1 float,io1 float,idle1 float) create table [dbo].[my_cpustats] -- @myspid smallint, int, @now datetime = getdate() [wait_type], insert into [dbo].[my_waitstats] ( -- = [waiting_tasks_count], now) [signal_wait_time_ms], [wait_time_ms], select insert into [dbo].[my_cpustats] values ( from sys.dm_os_wait_stats @now * AS FLOAT)/1000, End * AS FLOAT)/1000) * AS FLOAT)/1000, /****** Object: StoredProcedure [dbo].[end_waitstats] Script Date: 03/17/ :04:38 ******/ CREATE proc [dbo].[end_waitstats] if not exists (select 1 raiserror ('end_waitstats without begin..',16,1) with nowait @myspid smallint, s.[wait_type], s.[signal_wait_time_ms]-m.[signal_wait_time_ms] signal_wait_time, s.[wait_time_ms]-m.[wait_time_ms] wait_time, s.[waiting_tasks_count]-m.[waiting_tasks_count] waits, (s.[wait_time_ms]-m.[wait_time_ms])/(s.[waiting_tasks_count]-m.[waiting_tasks_count]) avg_time_waited, where s.[wait_type]=m.[wait_type] and s.[wait_time_ms]-m.[wait_time_ms] > 0 from sys.dm_os_wait_stats s, [dbo].[my_waitstats] m as 'elapsed_time in sec' and s.[wait_type] not in ( and s.[waiting_tasks_count]-m.[waiting_tasks_count] > 0 'RESOURCE_QUEUE', 'LAZYWRITER_SLEEP', 'CLR_SEMAPHORE', 'SLEEP_SYSTEMTASK', order by wait_time desc 'SQLTRACE_BUFFER_FLUSH', 'WAITFOR') * AS FLOAT)/1000)-m.idle1 as idletime * AS FLOAT)/1000)-m.io1 as iotime as now, * AS FLOAT)/1000)-m.cpu1 as cputime from my_cpustats m
16
Performance Dashboard
17
Performance Dashboard 2
18
Begin/End waitstats output
wait_type waits wait_time sigwaittime ela sec LCK_M_X LATCH_SH LATCH_EX PAGELATCH_SH PAGELATCH_EX PAGEIOLATCH_SH PAGEIOLATCH_EX IO_COMPLETION ASYNC_NETWORK_IO SLEEP_BPOOL_FLUSH SLEEP_TASK DTC BROKER_RECEIVE_WAITFOR SOS_SCHEDULER_YIELD WRITELOG CMEMTHREAD CXPACKET TRANSACTION_MUTEX DTC_ABORT_REQUEST BROKER_TASK_STOP now cputime iotime idletime :48:
19
Wait stats snapshots stacked bar
20
Maar… Nog steeds geen wait events per session, SQL statement of Batch.
Blijft een beetje gokken wie verantwoordelijk is voor welke wait events Tenzij je enge tools gebruikt van sqlinternals.com (voorbeeld) Of SQL Server 2008 gebruikt: Xevents! (voorbeeld), helaas geen DMV alleen XML gedoe Veel in SQL Server is Asynchronous, in tegenstelling tot Oracle. (voorbeeld pagiolatch waits vs filestats) Mooi voorbeeld: FTS: read ahead reads maken non-PQ scan heel snel! Vergeet de CPU tijd niet! ondanks dat wait events zeer belangrijk en onmisbaar zijn, is er meer op de wereld. Maar niet veel meer. ..de beste optimalisatie is eliminatie: doe alleen dingen die nodig zijn.
21
Voorbeelden uit de praktijk
insert loop, veel commits Broker problemen Langzamer wordende writelog Tempdb op mirrored disks Batch response tijd evenwicht: DB-appserver Demo SQL Server 2008 XEvents
22
Insert loop 10k rows, commit inside or outside SQLInternals tools)
Commit Inside loop, per row. (or actually no commit, no transaction, in SSMS) Spid Ec resource time(ms) count sig avg perc 51 0 Elapsedtime n/a 51 0 CPU , % 51 0 SOS_SCHEDULER_YIELD % 51 0 PAGEIOLATCH_SH ,8 4 % 51 0 PAGEIOLATCH_EX % 51 0 WRITELOG , % 51 0 Unaccounted for % One Commit outside of the loop, with begin transaction: 51 0 Elapsed time n/a 51 0 CPU % 51 0 SOS_SCHEDULER_YIELD , % 51 0 ASYNC_NETWORK_IO , % 51 0 WRITELOG % 51 0 Unaccounted for %
23
SQL Broker trouble (1 minuut snapshots):
wait_type waits wait_time signaltime LATCH_SH PAGEIOLATCH_SH PAGEIOLATCH_EX ASYNC_NETWORK_IO SLEEP_TASK SOS_SCHEDULER_YIELD WRITELOG CMEMTHREAD cputime iotime idletime , ,75 (volgende slide: sysprocesses)
24
SQL Broker trouble 2 sysprocesses:
spid kpid blocked waittype waittime lastwaittype waitresource cpu x CMEMTHREAD x CMEMTHREAD x LATCH_SH SERVICE_BROKER_TRANSMITTER (801C4264) x LATCH_SH SERVICE_BROKER_TRANSMITTER (801C40EC) x LATCH_SH SERVICE_BROKER_TRANSMITTER (801C4264) x LATCH_SH SERVICE_BROKER_TRANSMITTER (801C4264) (sysprocesses.command=‘BRKR TASK’) Spid 17 en 18 in een CPU loop while holding SB transmitter latch: blocking 19,23,25 en 27 Probleem: broker kan berichten niet kwijt vanwege certificate problemen. back
25
Trager wordende TXlog
26
Sqlstat uur dag Back
27
TEMPDB write times on mirrored disk
(Compare with previous slide: non-mirrored) back
28
Session timing: 10 min Batch: DB gebruikt slechts 1 resp 2 minuten!
Spid EC ResourceDescription Time(ms) Count SignalTime(ms) AvgTime(ms) Perc Elapsed time n/a CPU , % LCK_M_RS_S , % * LCK_M_S , % * PAGEIOLATCH_SH , % SOS_SCHEDULER_YIELD , % PAGELATCH_SH , % WRITELOG , % LCK_M_SCH_M ,5 0 % DTC , % TRANSACTION_MUTEX , % ASYNC_NETWORK_IO , % LCK_M_X ,75 1 % PAGEIOLATCH_EX , % PAGELATCH_EX , % Unaccounted for % 72 0 Elapsed time n/a 72 0 CPU , % 72 0 PAGEIOLATCH_SH , % 72 0 SOS_SCHEDULER_YIELD , % 72 0 IO_COMPLETION , % 72 0 ASYNC_NETWORK_IO , % 72 0 PAGELATCH_EX , % 72 0 DTC , % 72 0 TRANSACTION_MUTEX , % 72 0 PAGEIOLATCH_EX , % 72 0 LCK_M_RIn_NL , % 72 0 CMEMTHREAD % 72 0 LCK_M_S % 72 0 Unaccounted for % * The locking in the first session was resolved with read committed snapshots and isolation levels
29
Read io time summary count Ms/read
Eventueel ondersteunings slide: Deze slide laat een breakdown zien van read response tijden in aantallen per readsize in bytes Ms/read
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.