我们看到应用程序超时,在 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
当 SQL Server 从操作系统获取线程时,您会看到很多非常短暂的等待(每次几毫秒)。例如,如果 SQL Server 空闲了一段时间,然后一次执行多个并行查询,则可能会发生这种情况。当操作系统为 sqlservr.exe 进程提供线程时,这些查询将需要等待,
THREADPOOL
在此期间累积等待。您可以通过查看“进程”->“线程计数”PerfMon 计数器来确认这是否正在发生。通常,每当此值快速攀升时,您可能会看到这些
THREADPOOL
等待。在我的博客 ( Unusual THREADPOOL Waits ) 上有此行为的完整演示,以下是摘要:
需要明确的是,如果这些等待是您的应用程序超时的原因,我会感到惊讶。