Por que tenho esperas de THREADPOOL, embora tenha tópicos disponíveis?
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 THREADPOOL
esperas 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
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 THREADPOOL
esperas 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 THREADPOOL
esperas 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 THREADPOOL
esperas.
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.