SQL Server Waits

реклама
Дмитрий Артемов
[email protected]
SQL 2005 и
SQL 2008
Документация
так себе
Мы создали их для помощи в поиске
проблем
Там, давным давно (SQL 4.2) у нас были
блокировки, сеть и операции
ввода/вывода
Но со временем мы малость увлеклись
Имя ожидания – на усмотрение
разработчика
Ресурс
Синхронизация
Принуждение
• I/O, Network, Thread, Memory
• Locks, Latches, and “bunch of others”
• Yield or Sleep
Внешние
• Preemption
Очередь
• Background tasks
600
485
400
200
78
490
202
0
SQL 2000 SQL 2005 SQL 2008
SQL
2008R2
Разработчик пишет
код, который
“исполняется”
Любой, кто сделает
выборку из DMV видит
ожидание и
накопленное время
ожидания
Код сигнализирует об
окончании ожидания
Разработчик знает, что
он может вызвать код,
который вынужден
«ожидать»
Код фиксирует
последний тип
ожидания
Код очищает тип
ожидания, время и
последний тип
ожидания
Разработчик
устанавливает
ожидание
Разработчик вызывает
код SQLOS для
организации
«ожидания»
Обычное
дело для
SELECT
Запрос на LCK_M_IS
(Shared Intent)
блокировку
Понимает механику
диспетчера SQLOS
Ожидание приводит к
вызову
SignalObjectAndWait()
Мы знаем, что
придется
ждать
Запрос сталкивается
с конфликтом (ктото уже занял ресурс)
Создаем структуру
SOS_WaitInfo с
типом ожидания
LCK_M_IS
Используем
SOS_EventAuto класс
для организации
ожидания
Вызываем
LockOwner::Sleep
В итоге все сводится к
вызову WaitForSingleObject()
или SignalObjectAndWait()
SOS_EventAuto –
«обертка» для
объекта Windows
Kernel Event
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
Russinovich
UMS 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
Обломки прошлого
Трассировка в SQL2008
Инструменты
Activity Monitor
Performance Monitor Counters
Счетчик 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 показывает несколько строк для
параллельных запросов
Однако можно сделать sys.dm_exec_requests join
sys.dm_os_tasks
Блокировки
(механизм
синхронизации)
Намек: Ваше
приложение
LCK_XX
Намек:
Системная
таблица или
аллокация
BUF latch синхронизация
PAGELATCH and
PAGEIOLATCH
Намек:
задержка
I/O
Ресурс
В сумме
~50 типов
ожидания
ASYNC_NETWORK_IO
Намек: Сеть
или ваше
приложение
MISCELLANEOUS
Следовало бы
назвать «ожидания
нет»
Ожидания фоновых процессов
• LAZYWRITER_SLEEP
• SQLTRACE_BUFFER_FLUSH
• CHECKPOINT_QUEUE
• REQUEST_FOR_DEADLOCK_SEARCH
CLR_AUTO_EVENT
BOL называет их
Queue
Waits
Нормально для
SQL CLR
Чаще всего встречается
в DW и DSS типах
приложений
Используется для
синхронизации рабочих
процессов параллельного
плана
Если есть – это всего лишь
знак параллельного плана
Sync
Длительные времена
ожидания сигнализируют
о длительных
параллельных запросах
Что делать?
Возможно ничего
Посмотрите на текущие
задания
Вы ожидаете параллельные
запросы?
Определите запросы, которые
требуют оптимизации
Кто из них ожидает НЕ на
CXPACKET?
У вас длительное время
ожидания?
wait_resource показывает
координацию
Используйте указатель
MAXDOP
Проблема может лежать в
ином месте
Не торопитесь с
выводами
Измените настройку ‘max
degree of parallelism’
Параллелизм реализуется на уровне
компонентов запроса
В системе 2
процессора
!
SQL Server способен выполнять запрос сразу на
нескольких процессорах
Для большинства крупных запросов
параллелизм обеспечивает почти линейное
масштабирование
Однако, использование параллелизма
увеличивает накладные расходы на исполнение
запроса
Обычно параллелизм полезен в ситуации с
относительно небольшим числом конкурентных
запросов
SQL Server строит параллельные планы
горизонтально разделяя входные данные на
примерно равные наборы
Каждый кусок назначается своему CPU
А затем производится выполнение одинаковых
операций (агрегирование, соединение, …) на
каждом куске
Sync
Latch может быть
обобщенным
Виден как
LATCH_XX
Сколько их?
138 – SQL 2005
145 – SQL 2008
• Не только для страниц буфера (BUF)
• Для синхронизации структур памяти,
иных чем страницы данных
• В отличие от PAGELATCH и PAGEIOLATCH
Те же режимы как и для работы с
буфером (KP, SH, UP, EX, DT)
• sys.dm_os_latch_stats
• sys.dm_exec_requests.wait_resource
Latch
class
Sync
SQL Server Engine
INSERT
Нужно
место
INSERT
Нужно
место
INSERT
Нужно
место
INSERT
Нужно
место
“Нужно приращение”
LATCH_EX:
FGCB_ADD_REMOVE
FGCB
Нужно оценить
свободное место
LATCH_SH:
FGCB_ADD_REMOVE
Autogrow
mydb.mdf
Мораль:
Используйте
«Instant file
initialization»
но… оно не
работает для
журнала
Forced
I/O, Lock, Latch
Задачу, которая не отходит
«естественным образом»
принуждают к этому
• Что, если мы оплошали?
************************
*
* BEGIN STACK DUMP:
* 10/17/09 15:51:52 spid 0
*
* Non-yielding Scheduler
*
************************
Примеры
(когда мы заставляем код
передавать управление)
• Страницы, не требующие
I/O
• T-SQL переменные или
просто “expressions”
• Компиляция запросов
• Мелкие запросы с hash и
sort
Индикаторы
• Много ожиданий 
запросы с интенсивным
использованием CPU
• Длительные ожидания
 конкурентные запросы
с интенсивным
использованием CPU или
кто-то не отпускает
процессор как положено
Может быть
preemptive
поток
Resource
Применим к любой
задаче
TDS Login
Прием TDS
пакета
Engine создает
задачу в среде
SQLOS
Находит
доступный
поток
исполнителя
на диспетчере
Если потока
нет, мы
выставляем
ожидание типа
THREADPOOL
Когда поток
появляется, мы
передаем ему
задачу
Если ждали слишком долго
10 сек по умолчанию - Login Timeout
Виден только
среди waitstats и
tasks (не в списке
requests)
Request
= task +
worker
Возможно
понадобится DAC
для просмотра
PENDING tasks и
work_queue_count в
OS_schedulers > 0
Вина на ком-то еще
Смотрите за другими ожиданиями
Очередь часто весьма длинна
НЕ лечите проблему увеличением
числа рабочих потоков
COMMIT
TRAN
INSERT
Copy model
SQLTrace File
Sort I/O
Создание
файлов БД
Zero Log Files
Sync
Запись Log Buffer
Log Writer
WRITELOG
Log
Buffer
LOGBUFFER
Запрос на Log Buffer
Resource
IO_COMPLETION
File
ASYNC_IO_COMPLETION
Resource
Mylog.ldf
Log Cache
Все буферы
заняты
Resource
Page I/O
Mylog.ldf и .mdf
DISKIO_SUSPEND
Engine
Workers
VDI App
BACKUP WITH
SNAPSHOT
Sync
Backup
media
Hash и
sort
Resource
RESOURCE_SEMAPHORE
(Вызывается при
недостатке памяти для
запроса)
В SQL Server 2000
использовалось также для
компиляций
компиля
ции
RESOURCE_SEMAPHORE_
QUERY_COMPILE
• Недостаток памяти или слишком много одновременных пользователей
• MEMORYCLERK_SQLQUERYEXEC и MEMORYCLERK_SQLQERESERVATIONS
clerks (по данным DBCC MEMORYSTATUS)
• dm_exec_query_resource_semaphores
• dm_exec_query_memory_grants
• RESOURCE_SEMAPHORE_SMALL_QUERY waits
sys.dm_os_memory_brokers
DBCC MEMORYSTATUS
• Почему так много компиляций?
• Из-за нехватки памяти или как результат “жадных на память”
компиляций
• Система следит за состоянием памяти и нагрузкой и накладывает
ограничения на использование ресурсов (своего рода «ворота»)
• Высокие требования запросов по памяти, может привести к недостатку
памяти для компиляции
• Не часто встречается на 64bit системах
С появлением в SQL 2005 брокеров, управляющих распределением памяти, кеш запросов и кеш
компиляций стали конкурентами
session_id
265
299
requested_memory_kb
11,516,840
11,516,832
granted_memory_kb
11,516,840
11,516,832
required_memory_kb
7,424
2,048
Код может быть
сложнее чем
просто API вызов
Рабочие процессы
становятся pre-emptive при
вызове «внешнего» API,
который может занять
«некоторое» время
• Windows API
• Xproc
External
************************
*
* BEGIN STACK DUMP:
* 10/17/09 15:51:52 spid 0
*
* Non-yielding Scheduler
*
************************
Как это выглядело до SQL
2008?
• Status = RUNNING
• Wait_type = NULL
Как это выглядит для SQL
2008?
• Status = RUNNING
• Wait_type = PREEMPTIVE_XXXX
Тип
Описание
Сценарий
PREEMPTIVE_OS_GETPROCADDRESS
Оборачивает вызовы
GetProcAddress() и xproc
функций
Характеристика времени
исполнения xproc
PREEMPTIVE_OS_WRITEFILEGATHER
Оборачивает вызовы
WriteFileGather() для
обнуления секции файла
Длительные приращения
жернала или файла БД (если не
используется instant file init)
PREEMPTIVE_OS_LOOKUPACCOUNTSID
Оборачивает вызовы
LookupAccountSid()
В основном используется при
Windows аутентификации.
Длительные ожидания могут
говорить о проблемах с
контроллером домена.
PREEMPTIVE_OLEDBOPS
Оборачивают различные
фрагменты кода,
вызывающего методы OLEDB для запросов к
связанным серверам..
Помогает заполнить пробеля
там, где не установлены
ожидания для OLEDB.
~190 типов
Потому что он вызывает внешние
компоненты
Потому что процессоры занимаются в
основном переключением контекста, а
рабочие процессы сидят на ожидании
TRACEWRITE
wait_type
TRACEWRITE
wait_type
TRACEWRITE
waiting_tasks_count
6264780
waiting_tasks_count
0
wait_time_ms
222240185
wait_time_ms
0
max_wait_time_ms
215
max_wait_time_ms
0
signal_wait_time_ms
36752462
signal_wait_time_ms
0
preemptive_switches_count
TSQL
GUI
context_switches_count
653
418333
3270960
5057811
wait_info
wait_info_external
“Обычные”
ожидания
(file_io, network,
Sleep)
Pre-emptive
ожидания
wait_type
См.
dm_xe_map_values
opcode
Начало и
окончание
Timings
Duration, Total,
Max
Можно получить текст запроса, данные о сессии или
стек вызовов
Сессия умолчания System_Health Session включает эту
информацию
SQLCAT “Waits Stats Per Session” (www.codeplex.com)
“Почему не
урезается
журнал”
backoffs в
sys.dm_os_spinlock_stats
Плохо
написанная
DLL
PRECONNECT
статус
Ручное
управление
См заголовочный файл в исходниках
• Нет исходников? См. sys.dm_xe_map_values для SQL Server 2008
Список в документации
(http://msdn.microsoft.com/enus/library/ms179984.aspx)
KB 822101 только про типы для SQL 2000 и
раньше
Развитие Repository
•
•
•
•
The Wait Type
Repository Blog
Новые «открытия»
Комментарии
Использовать блог для обновления BOL
Размещение в блоге сценариев и доп. информации
Блог CSS Escalation (http://blogs.msdn.com/psssql/)
The Wait Type Repository Blog Post (http://blogs.msdn.com/psssql/archive/2009/11/03/the-sql-serverwait-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-manualevent-and-clr-auto-event.aspx)
Документ “SQL Server 2005 Waits and Queues“ (http://technet.microsoft.com/enus/library/cc966413.aspx)
Блог System_Health XEvent Session (http://blogs.msdn.com/psssql/archive/2008/07/15/supporting-sqlserver-2008-the-system-health-session.aspx)
sync reads, sorts,
SQLTrace I/O, load CLR
assembly
Buffer Pool I/O for
pages
Backups, Recovery,
DBM
WRITELOG wait time =
Log Flush Wait
(perfmon)
LOGBUFFER is just
waiting on folks waiting
on WRITELOG
MDW - Management Data Warehouse
sys.sysprocesses.waittype is a binary value
Binary to string mapping changed in SQL 2005
KB 822101 wrong
for 2005 and 2008
lastwaittype may NOT be current mapping if wait_type != NULL
sys.dm_xe_map_values has the correct mapping…….kind of
Forced
SLEEP_TASK
• Fixed time
• Hard to figure out scenario
Resource
DBMIRROR_DBM_EVENT
• Log shipping delayed to secondary
External
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
Sync
CMEMTHREAD
• Thread synchronization for memory allocation
• High wait times = A likely bug
Hot stored proc in SQL
Server 2005
Более 300 официальных курсов Microsoft доступно в России.
Официальные курсы можно прослушать только в авторизованных
учебных центрах Microsoft
под руководством опытного сертифицированного инструктора Microsoft
интенсивное обучение с акцентом на практику
более 80-и учебных центров более чем в 20-и городах России (+ дистанционные и
выездные курсы)
Сертификат Microsoft - показатель квалификации ИТ-специалиста для
работодателя .
Microsoft предлагает гибкую систему сертификаций.
•
40 %
Доказательство № 75
сертифицированных специалистов
считают, что сертификация помогла
им получить работу или повышение
•
57 %
Доказательство № 119
рекрутеров считают сертификацию
сотрудников одним из критериев
для повышения в должности
Все курсы, учебные центры и центры тестирования:
www.microsoft.com/rus/learning
Сертификационный пакет со вторым
шансом
Пакеты экзаменационных ваучеров со скидкой от 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 бесплатно
для слушателей курсов.
Количество ограничено!
Вопросы?
Скачать