Por que tenho esperas de THREADPOOL, embora tenha tópicos disponíveis?

Aug 16 2020

Estamos vendo tempos limite de aplicação e com a ajuda do Kit de Primeiros Socorros, eu capturei detalhes. Uma das coisas que me chamaram a atenção foi:

Espera de veneno detectada: pool de threads

Então, executei as seguintes consultas:

---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'

Quando executo a consulta "espera do pool de threads", as esperas do pool de threads aparecem no resultado acima (às vezes, mais de 20 resultados) por uma fração de segundo e depois desaparecem quando eu o executo novamente. Mas eu pude ver mais de 400 threads disponíveis no segundo conjunto de resultados por meio da consulta "threads disponíveis".

Não consigo entender por que estou vendo THREADPOOLesperas quando executo a primeira consulta, mas a segunda consulta mostra que os threads ainda estão disponíveis. Alguém pode explicar?

  • Maxdop: 8
  • Grau máximo de paralelismo: 50

O pool de threads espera:

Respostas

4 JoshDarnell Aug 27 2020 at 21:38

Não consigo entender por que vejo THREADPOOL em espera quando executo a primeira consulta, mas a segunda consulta mostra que os threads ainda estão disponíveis. Alguém pode explicar?

Eu observei que você pode ver muitas THREADPOOLesperas realmente breves (um punhado de milissegundos cada) enquanto o SQL Server está adquirindo threads do sistema operacional.

Isso pode acontecer se, por exemplo, o SQL Server ficar ocioso por um tempo e, em seguida, várias consultas paralelas forem executadas ao mesmo tempo. Essas consultas precisarão aguardar enquanto o sistema operacional fornece threads para o processo sqlservr.exe, acumulando THREADPOOLesperas durante esse tempo.

Você pode confirmar que isso está acontecendo observando o contador PerfMon "Process" -> "Thread Count". Geralmente, sempre que esse valor aumenta rapidamente, você pode ver essas THREADPOOLesperas.

Há uma demonstração completa desse comportamento no meu blog ( Unusual THREADPOOL Waits ). Aqui está o resumo:

Voltando para aquele link de documentos:

Ocorre quando uma tarefa está aguardando a execução de um trabalhador.

No caso típico, isso ocorre porque atingimos o limite lógico que o SQL Server definiu para quantos threads de trabalho você pode ter por vez.

No caso incomum, a tarefa está esperando por um trabalhador porque o SQL Server está alocando o thread (solicitando-o do sistema operacional) que é necessário para apoiar esse trabalhador.

Para ser claro, eu ficaria surpreso se essas esperas fossem a causa dos tempos limite de seu aplicativo.