Методики оптимизации ожидания ресурсов (SQL Server Waits) в...

Preview:

DESCRIPTION

SQL 2005 и SQL 2008. Методики оптимизации ожидания ресурсов (SQL Server Waits) в аналитических системах. Дмитрий Артемов dimaa@microsoft.com. Документация так себе. Что такое ожидание ?. Мы создали их для помощи в поиске проблем - PowerPoint PPT Presentation

Citation preview

Методики оптимизации ожидания ресурсов (SQL Server Waits) в аналитических системах

Дмитрий Артемовdimaa@microsoft.com

SQL 2005 и SQL 2008

Что такое ожидание?

Мы создали их для помощи в поиске проблемТам, давным давно (SQL 4.2) у нас были блокировки, сеть и операции ввода/выводаНо со временем мы малость увлеклисьИмя ожидания – на усмотрение разработчика

•I/O, Network, Thread, Memory

Ресурс

•Locks, Latches, and “bunch of others”

Синхронизация

•Yield or Sleep

Принуждение

•Preemption

Внешние

•Background tasks

Очередь

Документация так себе

SQL 2000 SQL 2005 SQL 2008 SQL 2008R2

0

200

400

600

78202

485 490

Как работает ожидание?

Разработчик пишет код, который

“исполняется”

Разработчик знает, что он может вызвать код,

который вынужден «ожидать»

Разработчик устанавливает

ожидание

Разработчик вызывает код SQLOS

для организации «ожидания»

Код фиксирует последний тип

ожидания

Любой, кто сделает выборку из DMV

видит ожидание и накопленное время

ожидания

Код сигнализирует об окончании

ожидания

Код очищает тип ожидания, время и

последний тип ожидания

Пример

Запрос на LCK_M_IS (Shared

Intent) блокировку

Запрос сталкивается с

конфликтом (кто-то уже занял

ресурс)

Создаем структуру

SOS_WaitInfo с типом ожидания

LCK_M_IS

Вызываем LockOwner::Sleep

Используем SOS_EventAuto

класс для организации

ожидания

Понимает механику диспетчера SQLOS

Ожидание приводит к вызову SignalObjectAndWait

()

Мы знаем, что

придется ждать

Обычное дело для SELECT

В итоге все сводится к вызову

WaitForSingleObject()или SignalObjectAndWait()

SOS_EventAuto – «обертка» для

объекта Windows Kernel Event

Кооперативная многозадачность SQL Server

Voluntary switching is roughly equivalent to a thread ordering an item that isn't ready to go at a fast-food counter. Rather than hold up the queue of the other diners, the thread will step aside and let the next thread place its order (execute its routine) while the first thread's hamburger is being prepared. When the hamburger is ready, the first thread goes to the end of the ready queue of the priority level.«Inside Microsoft Windows 2000» David A. Solomon, Mark RussinovichUMS implements a cooperative model. UMS relies on threads to voluntarily yield. UMS takes the approach it does in order to keep from involving the Windows kernel any more than absolutely necessary. In a system where worker threads can be counted on to yield when they should, a cooperative scheduler can actually be more efficient than a preemptive one because the scheduling process can be tailored to the specific needs of the application. UMS knows SQL Server's scheduling needs better than the operating system can be expected to. «The Guru's Guide to SQL Server Architecture and Internals» By Ken Henderson

Как увидеть ожидания?

sys.dm_os_wait_stats

sys.dm_exec_requests

sys.dm_os_waiting_tasks

sys.sysprocesses

Extended Events

Management Data Warehouse

Activity Monitor

Performance Monitor Counters

Историческая статистика

«Живая» информация

Обломки прошлого

Трассировка в SQL2008

Инструменты

Счетчик Wait Statistics

select er.session_id, er.wait_type from sys.dm_exec_requests er join sys.dm_exec_sessions es on er.session_id=es.session_id where es.is_user_process = 1 –- для выделения пользовательских процессов-- в sql server 2000 они всегда были SPID < 51, теперь могут быть любыми

Sysprocesses – нужно или нет?

Показывает открытые транзакции в неактивных потокахК тому же Sysprocesses показывает несколько строк для параллельных запросов

Однако можно сделать sys.dm_exec_requests join sys.dm_os_tasks

Ну, начнем!

Частые типы ожиданий

LCK_XXPAGELATCH

and PAGEIOLATCH

ASYNC_NETWORK_IO

Блокировки (механизм

синхронизации)

Намек: Сеть или

ваше приложени

е

Намек: задержк

а I/O

Намек: Ваше

приложение

В сумме ~50 типов ожидания

Ресурс

Намек: Системная

таблица или

аллокация

BUF latch - синхронизация

Некоторые типы не сигнализируют о проблемах

MISCELLANEOUS

• LAZYWRITER_SLEEP• SQLTRACE_BUFFER_FLUSH• CHECKPOINT_QUEUE• REQUEST_FOR_DEADLOCK_SEARCH

Ожидания фоновых процессов

CLR_AUTO_EVENT

BOL называет

их Queue Waits

Следовало бы назвать

«ожидания нет»

Нормально для SQL CLR

CXPACKET – миф и реальность

Используется для синхронизации рабочих

процессов параллельного плана

Если есть – это всего лишь знак параллельного

плана

Вы ожидаете параллельные запросы?

У вас длительное время ожидания?

wait_resource показывает координацию

Длительные времена ожидания

сигнализируют о длительных

параллельных запросах

Посмотрите на текущие задания

Кто из них ожидает НЕ на

CXPACKET?

Проблема может лежать в ином

месте

Что делать?

Возможно ничего

Определите запросы, которые требуют

оптимизации

Используйте указатель MAXDOP

Измените настройку ‘max degree of

parallelism’

Sync

Не торопитесь с выводами

Чаще всего встречается в DW и

DSS типах приложений

CXPACKET

Параллелизм реализуется на уровне компонентов запроса

В системе 2 процессора!

Пара слов про параллелизм

SQL Server способен выполнять запрос сразу на нескольких процессорахДля большинства крупных запросов параллелизм обеспечивает почти линейное масштабированиеОднако, использование параллелизма увеличивает накладные расходы на исполнение запросаОбычно параллелизм полезен в ситуации с относительно небольшим числом конкурентных запросов

Еще пара слов про пара…SQL Server строит параллельные планы горизонтально разделяя входные данные на примерно равные наборы

Каждый кусок назначается своему CPU

А затем производится выполнение одинаковых операций (агрегирование, соединение, …) на каждом куске

non BUFFER Latch

•Не только для страниц буфера (BUF)•Для синхронизации структур памяти, иных чем страницы данных

Latch может быть

обобщенным

•В отличие от PAGELATCH и PAGEIOLATCH

Виден как LATCH_XX

•sys.dm_os_latch_stats•sys.dm_exec_requests.wait_resource

Сколько их?138 – SQL 2005145 – SQL 2008

Те же режимы как и для работы с буфером (KP, SH, UP,

EX, DT)Latch class

Sync

FGCB_ADD_REMOVE latch

mydb.mdfAutogrow

INSERT

INSERT

INSERT

INSERT

FGCB

Нужно

место

Нужно

место

SQL Server Engine

Нужно

место

Нужно

место

“Нужно приращение”

LATCH_EX: FGCB_ADD_REMOV

E

Нужно оценить свободное место

LATCH_SH: FGCB_ADD_REM

OVE

Sync

Мораль: Используйте «Instant

file initialization» но… оно

не работает для

журнала

SOS_SCHEDULER_YIELD

Задачу, которая не отходит «естественным образом» принуждают

к этому

•Что, если мы оплошали?

Примеры(когда мы заставляем

код передавать управление)

•Страницы, не требующие I/O•T-SQL переменные или просто “expressions”•Компиляция запросов•Мелкие запросы с hash и sort

Индикаторы

•Много ожиданий запросы с интенсивным использованием CPU•Длительные ожидания конкурентные запросы с интенсивным использованием CPU или кто-то не отпускает процессор как положено

************************** BEGIN STACK DUMP:* 10/17/09 15:51:52 spid 0** Non-yielding Scheduler*************************

Forced

Может быть

preemptive поток

I/O, Lock, Latch

THREADPOOL

Прием TDS

пакета

Engine создает задачу в

среде SQLOS

Находит доступный

поток исполнител

я на диспетчере

Если потока нет, мы

выставляем ожидание

типа THREADPOOL

Когда поток

появляется, мы

передаем ему задачу

TDS Login

Если ждали слишком долго

10 сек по умолчанию - Login Timeout

Виден только среди waitstats

и tasks (не в списке requests)

Возможно понадобится

DAC для просмотра

PENDING tasks и work_queue_count в OS_schedulers

> 0

Применим к любой задаче

Вина на ком-то еще

Смотрите за другими ожиданиями

Очередь часто весьма длиннаНЕ лечите проблему

увеличением числа рабочих потоков

Resource

Request =

task + worker

Log Cache

Как насчет ожиданий на I/O

Mylog.ldf

Log WriterCOMMIT TRAN

Log BufferINSERT

Запись Log Buffer

Запрос на Log BufferВсе буферы

заняты

LOGBUFFER

WRITELOG

File

Copy model

SQLTrace File

Sort I/O

IO_COMPLETION

Zero Log Files

Создание файлов БД ASYNC_IO_COMPLETION

Mylog.ldf и .mdf

Backup media

VDI AppEngine

Workers

Page I/O

BACKUP WITH SNAPSHOT

DISKIO_SUSPEND

Resource

Sync

Resource

Resource

Sync

Запросы, память и RESOURCE semaphore

•Недостаток памяти или слишком много одновременных пользователей•MEMORYCLERK_SQLQUERYEXEC и MEMORYCLERK_SQLQERESERVATIONS clerks (по данным DBCC MEMORYSTATUS)•dm_exec_query_resource_semaphores•dm_exec_query_memory_grants•RESOURCE_SEMAPHORE_SMALL_QUERY waits

RESOURCE_SEMAPHORE(Вызывается при

недостатке памяти для запроса)

В SQL Server 2000 использовалось также

для компиляций

•Почему так много компиляций?•Из-за нехватки памяти или как результат “жадных на память” компиляций•Система следит за состоянием памяти и нагрузкой и накладывает ограничения на использование ресурсов (своего рода «ворота»)•Высокие требования запросов по памяти, может привести к недостатку памяти для компиляции•Не часто встречается на 64bit системах

RESOURCE_SEMAPHORE_QUERY_COM

PILE

Resource

Hash и sort

компиляции

sys.dm_os_memory_brokersDBCC MEMORYSTATUS

С появлением в SQL 2005 брокеров, управляющих распределением памяти, кеш запросов и кеш компиляций стали конкурентами

Resource_Semaphoresession_id

requested_memory_kb

granted_memory_kb

required_memory_kb

265 11,516,840 11,516,840 7,424299 11,516,832 11,516,832 2,048

Filtered statistics

Pre-emptive Waits

•Windows API•Xproc

Рабочие процессы становятся pre-emptive при

вызове «внешнего» API, который может занять

«некоторое» время

•Status = RUNNING•Wait_type = NULL

Как это выглядело до

SQL 2008?

•Status = RUNNING•Wait_type = PREEMPTIVE_XXXX

Как это выглядит для

SQL 2008?

External

************************* * BEGIN STACK DUMP:* 10/17/09 15:51:52 spid 0** Non-yielding Scheduler*************************

Код может быть сложнее чем

просто API вызов

Что можно увидеть?Тип Описание Сценарий

PREEMPTIVE_OS_GETPROCADDRESS 

Оборачивает вызовы GetProcAddress() и xproc функций

Характеристика времени исполнения xproc

PREEMPTIVE_OS_WRITEFILEGATHER

Оборачивает вызовы WriteFileGather() для обнуления секции файла

Длительные приращения жернала или файла БД (если не используется instant file init)

PREEMPTIVE_OS_LOOKUPACCOUNTSID

Оборачивает вызовыLookupAccountSid()

В основном используется при Windows аутентификации. Длительные ожидания могут говорить о проблемах с контроллером домена.

PREEMPTIVE_OLEDBOPS Оборачивают различные фрагменты кода, вызывающего методы OLE-DB для запросов к связанным серверам..

Помогает заполнить пробеля там, где не установлены ожидания для OLEDB.

~190 типов

Почему плохо использовать Profiler через GUI?

Потому что он вызывает внешние компонентыПотому что процессоры занимаются в основном переключением контекста, а рабочие процессы сидят на ожидании TRACEWRITE

preemptive_switches_count context_switches_count

TSQL 653 3270960GUI 418333 5057811

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_msTRACEWRITE 6264780 222240185 215 36752462

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_msTRACEWRITE 0 0 0 0

Расширенные события и ожидания

wait_info

“Обычные”

ожидания(file_io,

network,Sleep)

wait_info_external

Pre-emptive

ожидания

wait_type

opcode

Timings

Можно получить текст запроса, данные о сессии или стек вызовов

Сессия умолчания System_Health Session включает эту информацию

SQLCAT “Waits Stats Per Session” (www.codeplex.com)

См. dm_xe_map_val

ues

Начало и окончание

Duration, Total, Max

Есть и другие “ожидания”

log_reuse_wait “loader lock wait”

sessions Spinlocks

Resource Governor

backoffs в sys.dm_os_spinlock_s

tats

“Почему не урезается журнал”

Плохо написанна

я DLL

PRECONNECT статус

Ручное управлени

е

Огласите весь список, пожалуйста!

• Нет исходников? См. sys.dm_xe_map_values для SQL Server 2008

См заголовочный файл в исходниках

Список в документации (http://msdn.microsoft.com/en-us/library/ms179984.aspx)

KB 822101 только про типы для SQL 2000 и раньше

• Новые «открытия»• Комментарии • Использовать блог для обновления BOL• Размещение в блоге сценариев и доп. информации

Развитие RepositoryThe Wait Type

Repository Blog

РесурсыБлог CSS Escalation (http://blogs.msdn.com/psssql/)

The Wait Type Repository Blog Post (http://blogs.msdn.com/psssql/archive/2009/11/03/the-sql-server-wait-type-repository.aspx)

Документация по sys.dm_os_wait_stats

SQLCAT Waits Stats Per Session CodePlex (http://sqlcat.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26601)

Craig Freedman – статьи о параллелизме (http://blogs.msdn.com/craigfr/archive/tags/Parallelism/default.aspx)

Блог CLR Wait Types (http://blogs.msdn.com/psssql/archive/2008/02/05/high-waits-on-clr-manual-event-and-clr-auto-event.aspx)

Документ “SQL Server 2005 Waits and Queues“ (http://technet.microsoft.com/en-us/library/cc966413.aspx)

Блог System_Health XEvent Session (http://blogs.msdn.com/psssql/archive/2008/07/15/supporting-sql-server-2008-the-system-health-session.aspx)

Appendix

What does MDW tell you about I/O Waits

sync reads, sorts, SQLTrace I/O, load

CLR assembly

Backups, Recovery, DBM

Buffer Pool I/O for pages

WRITELOG wait time =

Log Flush Wait (perfmon)

LOGBUFFER is just waiting on folks

waiting on WRITELOG

MDW - Management Data Warehouse

The mapping has changed

KB 822101 wrong for 2005

and 2008

What’s About These?SLEEP_TASK

• Fixed time• Hard to figure out scenario

DBMIRROR_DBM_EVENT

• Log shipping delayed to secondary

OLEDB

• Wrapped around linked server OLE-DB API calls• Wait time will fluctuate since set and cleared for each call• wait_resource is remote server and remote SPID• PREEMPTIVE_XX type can now also show up

CMEMTHREAD

• Thread synchronization for memory allocation• High wait times = A likely bug

Forced

Resource

External

Sync

Hot stored proc in SQL Server 2005

Прошу вас заполнить форму с оценкой сессии!

Официальные курсы и сертификация Microsoft

Более 300 официальных курсов Microsoft доступно в России. Официальные курсы можно прослушать только в авторизованных учебных центрах Microsoft

под руководством опытного сертифицированного инструктора Microsoftинтенсивное обучение с акцентом на практикуболее 80-и учебных центров более чем в 20-и городах России (+ дистанционные и выездные курсы)

Сертификат Microsoft - показатель квалификации ИТ-специалиста для работодателя .

• Microsoft предлагает гибкую систему сертификаций.

• Все курсы, учебные центры и центры тестирования: www.microsoft.com/rus/learning

40% Доказательство № 75

сертифицированных специалистов считают, что сертификация помогла им получить работу или повышение

57% Доказательство № 119

рекрутеров считают сертификацию сотрудников одним из критериев для повышения в должности

Специальные предложенияСертификационный пакет со вторым шансом

Пакеты экзаменационных ваучеров со скидкой от 15 до 20% и бесплатной пересдачей («вторым шансом»). Все экзамены сдаются одним человеком.

Сэкономьте 15% на сертификации вашей ИТ-команды

Пакет из 10-и экзаменационных ваучеров со скидкой 15% для сотрудников ИТ-отдела. «Второй шанс» включен. Ваучеры можно произвольно распределять между сотрудниками.

Microsoft Certified Career ConferenceПервая 24-часовая глобальная виртуальная конференция с 18 ноября с 15.00 (моск. время) по 19 ноября 2010 г.Сессии по технологиям и построению карьерыСкидка 50% для сертифицированных специалистов Microsoft и студентов

Бесплатная подписка на TechNet для слушателей официальных курсов

Некоторые курсы по SharePoint, Windows 7; Windows Server 2008; SQL Server 2008

Детали: www.microsoft.com/rus/learning

С 22 ноября 2010 г. – подписка TechNet

бесплатно для слушателей курсов.

Количество ограничено!

Спасибо!Вопросы?

Recommended