MS SQL Server stojící, bdící Miloslav Peterka, BI Experts, s.r.o. MCSE: Data Platform | Business Intelligence | Data Management and Analytics miloslav.peterka@biexperts.cz
Osnova Úvod do problematiky SQLOS a zpracování úloh v SQL Serveru Katalogové pohledy Běžné prostoje IO CPU Ostatní Závěrem
Úvod do problematiky MS SQL Server Database Engine Serverová služba Řeší požadavky (úlohy) klientů (aplikací) Typicky velké množství současně Řešená úloha zatěžuje CPU Současně zpracovávané požadavky soupeří o omezené zdroje Pokud úloze chybí potřebné zdroje, požadavek čeká na zpracování Projevuje se jako výkonnostní problém SQL Server zaznamenává informace o délce čekání a jeho příčinách
SQLOS a zpracování úloh v SQL Serveru Session Vytvářená pro autentizované připojení Identifikovaná unikátním session_id (SPID) Request Požadavek zaslaný v rámci session aplikací (uživatelem) Scheduler Rozděluje práci CPU (jeden scheduler na jedno CPU) Pracuje kooperativně Probíhající úloha dobrovolně uvolní CPU ostatním
SQLOS a zpracování úloh v SQL Serveru Worker Thread svázaný s daným schedulerem Vykonává jednu úlohu (task) CPU time využitý workerem omezen Na dobu, dokud není požadován nedostupný zdroj nebo Dokud není vyčerpáno quantum Pak se worker dobrovolně vzdá CPU ve prospěch jiné úlohy Pokud worker nepracuje a čeká na na dostupnost zdroje, vzniká prostoj - wait
SQLOS a zpracování úloh v SQL Serveru Running SPID 60 Running Running SPID 60 IO_COMPLETION Running SPID 51 Running Waiting tasks (Resource Waits) SPID 73 LCK_M_S SPID 59 NETWORKIO SPID 55 LOGMGR SPID 60 IO_COMPLETION Waiting tasks (Resource Waits) SPID 73 LCK_M_S SPID 59 NETWORKIO SPID 56 CXPACKET SPID 55 LOGMGR SPID 60 IO_COMPLETION Runnable queue (Signal Wait) SPID 51 Runnable SPID 64 Runnable SPID 87 Runnable SPID 52 Runnable SPID 93 Runnable SPID 56 Runnable
Katalogové pohledy s informacemi o „waitech“ sys.dm_os_waiting_tasks Pohled na čekající úlohy Vhodný pro zkoumání aktuálních výkonnostních potíží sys.dm_os_wait_stats Obsahuje celkové kumulované časy prostojů vlastní prostoj plus signal wait time Vyprázdněn restartem služby nebo smazáním statistik (DBCC SQLPERF)
Demo SQLOS objekty Katalogové pohledy
Co je dobré vědět Bez prostojů to nejde Řada prostojů se dá ignorovat Samotné vyhodnocení prostojů nestačí Třeba korelovat s jinými informacemi Performance monitor Katalogové pohledy SQL Serveru Statistiky indexů, virtuálních souborů, latch, spinlocks, … Je vhodné vytvořit baseline, ke které lze vztahovat následná měření Existující nástroje mohou výrazně pomoci
Běžné prostoje - IO PAGEIOLATCH_XX Nastává, pokud úloha požaduje datovou stránku, která není v paměti Je alokována stránka v paměťovém bufferu, na které se drží latch, dokud není stránka načtena z disku SH pro čtení, EX pro zápis Možné příčiny Špatné dotazy (často s vysokým CXPACKET díky paralelním skenům) Nedostatek paměti Nedostatečná propustnost IO subsystému Vhodné korelovat s sys.dm_io_virtual_file_stats a čítači objektu PhysicalDisk
Běžné prostoje - IO WRITELOG SQL Server zapisuje při potvrzení transakce log záznamy z paměti na disk WRITELOG reprezentuje čekání na zápis dat do transakčního logu Operace synchronní s potvrzením transakce Typicky vzniká při uložení transakčních logů z více intenzivně využívaných databází na jednom disku Zbytečné zápisy generuje například Údržba nevyužitých neklastrovaných indexů Nadměrný rebuild indexů Konstantní dělení stránek
Běžné prostoje - IO IO_COMPLETION a ASYNC_IO_COMPLETION Prostoj generován synchronními IO operacemi, které nepracují s tabulkami (buffer poolem), například: Čtení logu při zotavení Čtení alokačních bitmap Zápis mezivýsledků třídění, merge joinů Checkpoint na začátku zálohování Čtení ze zálohy během zálohování
Běžné prostoje - CPU CXPACKET Vzniká při synchronizaci paralelních exekučních plánů Často představuje důsledek, nikoli příčinu Snížení možné Zvýšením prahu pro paralelní plány Snížením míry paralelismu Odstraněním skutečné příčiny blokující paralelní úlohu (IO, statistiky, …) Nový CXCONSUMER odlišuje nepodstatné Paralelismus problémem, pokud s CXPACKED dominují LATCH_EX (ACCESS_METHODS_DATASET_PARENT) SOS_SCHEDULER_YIELD
Běžné prostoje - CPU SOS_SCHEDULER_YIELD Vzniká v důsledku kooperativního multitaskingu v SQLOS Task, který vyčerpá quantum, generuje SOS_SCHEDULER_YIELD Často indikátor rozsáhlých skenů Pokud se nevyskytuje současně s prostoji PAGEIOLATCH_*, ukazuje na nedostatečný výpočetní výkon Úzké hrdlo na straně CPU se dále typicky projevuje Velkým počtem úloh v runnable frontě Vysokým podílem signal_wait_time
Běžné prostoje - ostatní LCK_M_XX Čekání na uvalení zámku typu XX LATCH_XX Čekání na uvalení latche mimo buffer pool, detaily v sys.dm_os_latch_stats BACKUPIO Prostoj při čtení a zápisu z/do záložního souboru ASYNC_NETWORK_IO SQL Server čeká na zpracování dat na straně klienta
Závěrem Analýza prostojů je dobrým výchozím bodem k detekci příčin výkonnostních problémů Pro potvrzení podezření je třeba korelovat s dalšími informacemi Ne vše ale měří Propustnost RAM
Děkuji za pozornost Miloslav Peterka, BI Experts, s.r.o. MCSE: Data Platform | Business Intelligence | Data Management and Analytics miloslav.peterka@biexperts.cz