Почему у меня есть ожидания THREADPOOL, хотя у меня есть доступные потоки?
Мы наблюдаем тайм-ауты приложений, и с помощью First Responder Kit я зафиксировал детали. Мое внимание привлекла одна из вещей:
Обнаружено подозрительное ожидание: пул потоков
Итак, я выполнил следующие запросы:
---get thread pool waits---thread pool wait query
SELECT count(*) FROM sys.dm_os_waiting_tasks
where wait_type ='threadpool'
-- get threads available--Threads available query
declare @max int
select @max = max_workers_count from sys.dm_os_sys_info
select
@max as 'TotalThreads',
sum(active_Workers_count) as 'CurrentThreads',
@max - sum(active_Workers_count) as 'AvailableThreads',
sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
sum(work_queue_count) as 'RequestWaitingForThreads' ,
sum(current_workers_count) as 'AssociatedWorkers',
Getdate() as 'DateLogged'
from
sys.dm_os_Schedulers where status='VISIBLE ONLINE'
Когда я запускаю запрос «ожидание пула потоков», ожидания пула потоков появляются в приведенном выше результате (иногда более 20 результатов) на долю секунды, а затем исчезают, когда я запускаю его снова. Но я мог видеть более 400 потоков, доступных во втором наборе результатов через запрос «доступные потоки».
Я не могу понять, почему я вижу THREADPOOL
ожидания при запуске первого запроса, но второй запрос показывает, что потоки все еще доступны. Кто-нибудь может объяснить?
- Максдоп: 8
- Максимальная степень параллельности: 50
Пул потоков ждет:
Ответы
Я не могу понять, почему я вижу, что THREADPOOL ждет, когда я запускаю первый запрос, но второй запрос показывает, что потоки все еще доступны. Кто-нибудь может объяснить?
Я заметил, что вы можете увидеть множество действительно коротких THREADPOOL
ожиданий (по несколько миллисекунд каждое), пока SQL Server получает потоки из операционной системы.
Это может произойти, если, например, SQL Server какое-то время простаивал, а затем одновременно выполнялось несколько параллельных запросов. Этим запросам нужно будет дождаться, пока ОС предоставит потоки процессу sqlservr.exe, накапливая THREADPOOL
ожидания в течение этого времени.
Вы можете убедиться, что это происходит, посмотрев на счетчик PerfMon «Процесс» -> «Количество потоков». Обычно, когда это значение быстро растет, вы можете увидеть эти THREADPOOL
ожидания.
В моем блоге есть полная демонстрация этого поведения ( необычные ожидания THREADPOOL ), вот краткое изложение:
Возвращаясь к этой ссылке на документы:
Происходит, когда задача ожидает выполнения рабочего.
В типичном случае это связано с тем, что мы достигли логического предела, установленного SQL Server для количества рабочих потоков, которые вы можете иметь одновременно.
В необычном случае задача ожидает рабочего, потому что SQL Server выделяет поток (запрашивая его у ОС), который необходим для поддержки этого рабочего.
Чтобы было ясно, я был бы удивлен, если бы эти ожидания были причиной тайм-аутов вашего приложения.