Почему у меня есть ожидания THREADPOOL, хотя у меня есть доступные потоки?

Aug 16 2020

Мы наблюдаем тайм-ауты приложений, и с помощью 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

Пул потоков ждет:

Ответы

4 JoshDarnell Aug 27 2020 at 21:38

Я не могу понять, почему я вижу, что THREADPOOL ждет, когда я запускаю первый запрос, но второй запрос показывает, что потоки все еще доступны. Кто-нибудь может объяснить?

Я заметил, что вы можете увидеть множество действительно коротких THREADPOOLожиданий (по несколько миллисекунд каждое), пока SQL Server получает потоки из операционной системы.

Это может произойти, если, например, SQL Server какое-то время простаивал, а затем одновременно выполнялось несколько параллельных запросов. Этим запросам нужно будет дождаться, пока ОС предоставит потоки процессу sqlservr.exe, накапливая THREADPOOLожидания в течение этого времени.

Вы можете убедиться, что это происходит, посмотрев на счетчик PerfMon «Процесс» -> «Количество потоков». Обычно, когда это значение быстро растет, вы можете увидеть эти THREADPOOLожидания.

В моем блоге есть полная демонстрация этого поведения ( необычные ожидания THREADPOOL ), вот краткое изложение:

Возвращаясь к этой ссылке на документы:

Происходит, когда задача ожидает выполнения рабочего.

В типичном случае это связано с тем, что мы достигли логического предела, установленного SQL Server для количества рабочих потоков, которые вы можете иметь одновременно.

В необычном случае задача ожидает рабочего, потому что SQL Server выделяет поток (запрашивая его у ОС), который необходим для поддержки этого рабочего.

Чтобы было ясно, я был бы удивлен, если бы эти ожидания были причиной тайм-аутов вашего приложения.