博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]SQL Server等待事件—THREADPOOL
阅读量:5255 次
发布时间:2019-06-14

本文共 2557 字,大约阅读时间需要 8 分钟。

 

    前言: 本文是对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  (感谢乔纳森的博客 )。

 

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会创建多少个工作线程的详细信息,你可以参考文档.

 

  当一个查询去执行时,SQL Server会决定需要多少个线程(请见Paul Whtile的博客),并且决定为线程池(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

 

 

转载于:https://www.cnblogs.com/kerrycode/p/8875781.html

你可能感兴趣的文章
python--输入一组无序的数,排序
查看>>
第八天 线性表【下】
查看>>
现代软件工程_第一周练习_第4题02_万世想
查看>>
[转]Log4j使用总结
查看>>
ssh(安全外壳协议)
查看>>
python基础_特殊符号
查看>>
关于Java序列化和Hadoop的序列化
查看>>
创建线程的三种方式
查看>>
docker rancher 体验 (未完待续.....)
查看>>
10反射
查看>>
Android操作Sqlite数据库
查看>>
opencv 鼠标交互
查看>>
iOS之地图开发
查看>>
[Swift]LeetCode1015. 可被 K 整除的最小整数 | Smallest Integer Divisible by K
查看>>
[Swift]LeetCode1124. 表现良好的最长时间段 | Longest Well-Performing Interval
查看>>
[Swift]LeetCode942. 增减字符串匹配 | DI String Match
查看>>
Pascal代码自动格式化
查看>>
蔡康永的说话之道2-透过说话,懂得把别放在心上
查看>>
计算机网络设备之交换机和路由器
查看>>
软件工程(2019)结对编程第一次作业
查看>>