欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[翻译]SQL Server等待事件—THREADPOOL

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

 

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

 

英文原文地址:https://www.sqlskills.com/help/waits/threadpool/

 

 

翻译原文地址:http://www.cnblogs.com/kerrycode/p/8875781.html

 

 

 

等待事件描述:

 

这个等待类型出现是因为服务器的线程池(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