翻译原来的小说地址

 

   
前言: 本文是对SQLSkills上一篇关于SQL
Server中THREADPOOL等待的博客的翻译,本文也不是完全翻译,有些地方适当加入了自己的一些认知。如有翻译不对或不好的地方,敬请指出,大家一起学习进步。尊重原创和翻译劳动成果,转载时请注明出处。谢谢!

 

英文原文地址:

 

 

翻译原文地址:

 

 

 

等待事件描述:

 

这个等待类型出现是因为服务器的线程池(Thread
Pool)没有可用的线程,它可能导致登录失败或SQL语句无法正常运行。

 

(联机丛书描述:“当任务在等待工作线程(worker
thread)运行时出现这个等待事件。这可能表明数据库参数max worker
threads的值设置过低, 或者批处理执行时间过长,
从而减少了可用于满足其它批处理的工作线程(worker
thread)数量。(举个生活当中的例子,当你去饭店吃饭,工作线程好比餐厅的服务员,例如服务员过少或某些顾客占用服务员的时间过长,那么就会出现很多顾客郁闷地长时间等待服务的现象)

 

Questions/comments
on this wait type?

Click here to send Paul an
email, especially if you have any information to add to this
topic.

 

Added
in SQL Server version:

Pre-2005/2005

 

Removed
in SQL Server version:

N/A

 

 

扩展事件wait_type的值:

 

这个等待类型在sys.dm_xe_map_vlaues中对应的扩展事件为SOS_WORKER  (感谢乔纳森的博客
Mapping wait types in dm_os_wait_stats to Extended
Events)。

 

sys.dm_xe_map_values中的map_key值在SQL
Server 2008和 SQL Server 2008 R2 中为113, 在SQL Server 2012和 2014
RTM中值为117。在 SQL Server 2014 RTM 之后,
您必须检查DMV视图获得它的最新的值, 因为一些map_keyvalues
的值在后续的版本中改变了。

 

 

其它信息

 

  SQL
Server实例在启动的时候创建了一定数量的工作线程(workder
threads),举个例子, 我的笔记本的CPU有8个逻辑处理器,因此SQL
Server实例启动的时候创建了576个工作线程。你可以从sys.dm_os_sys_info这个DMV视图中的max_worker_count列查看你的实例分配了多少工作线程。关于SQL
Server会创建多少个工作线程的详细信息,你可以参考文档Configure the max
worker threads Server Configuration
Option.

 

  当一个查询去执行时,SQL
Server会决定需要多少个线程(请见Paul Whtile的博客Parallel Execution
Plans – Branches and
Threads翻译原来的小说地址。),并且决定为线程池(thread
pool)保留多少个线程。 如果没有足够可用的线程,此时threadpool
等待就会出现,如果没有可用的线程, 连接到SQL Server就会失败。

 

 

 

可能有多种原因导致工作线程发生饥饿现象(Worker
thread starvation
),包括下面一些情况:

 

 

·        
一个线程获取了一个锁,然后导致其它线程被阻塞,越来越多的连接出现并被阻塞,最终耗尽了线程池(thread
pool)中的线程。

 

  

   
这种情况可以从sys.dm_os_翻译原来的小说地址。waiting_tasks
这个DMV视图中(使用我的脚本)找出被单个SPID阻塞的记录,并考虑将其杀死。

 

 

 

·        
并行查询计划正在被数百个连接执行,耗尽了线程池中线程。

 

 

   
查看CXPACKET等待并标识那些并行执行计划的SQL语句,尽可能减少并行的总量发生。

 

翻译原来的小说地址。 

 

·        
一个查询计划正在被许多连接执行,并且查询时间比平时要长,耗尽了线程池的线程。

 

 

   
查询CXPACKET等待并如何识别偏斜平行度(skewed
parallelism)

 

   
还要查找那些长时间运行的查询语句,并调查发生了什么等待以查看是否存在常规性能问题导致线程匮乏,或者那些长时间运行的SQL语句是否有不正确的查询计划。

 

 

 

·        
SQL
Server中的活动会话数等于工作线程数

 

 

 检查sys.dm_exec_requests视图中的记录数,如果记录数接近工作线程数量,
减少连接数量(例如,应用程序是否没有使用连接池或没有正确关闭)或增加max
worker threads
的值。请注意,由于空闲连接不消耗工作线程,因此与SQL
Server连接的数量可能超过活动(Active)的连接,这可能是完全正常的。

 

 

·        
对max
worker thread参数的不正确配置。

 

 

查看max
worker worker thread 选项的值并设置为自动调整。

 

 

   

   如果由于工作线程不足(worker
thread starvation)无法连接到SQL
Server去进行故障诊断,请尝试使用专用管理员连接(DAC)。

 

 

Known
occurrences in SQL Server
 (list
number matches call stack list):

  1. Waiting
    for a worker thread to become available

Abbreviated
call stacks (list number matches known occurrences list):

  1. SOS_Scheduler::UpdateWaitTimeStats+30c

WorkDispatcher::DequeueTask+211

SOS_Scheduler::ProcessTasks+1e3

SchedulerManager::WorkerEntryPoint+261

SystemThread::RunWorker+8f

SystemThreadDispatcher::ProcessWorker+3c8

SchedulerManager::ThreadEntryPoint+236

BaseThreadInitThunk+d

RtlUserThreadStart+1d

 

 

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图