Дмитрий Артемов 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 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 бесплатно для слушателей курсов. Количество ограничено! Вопросы?