zoukankan      html  css  js  c++  java
  • [翻译]SQL Server等待事件—THREADPOOL

     

        前言: 本文是对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

     

     

  • 相关阅读:
    LeetCode链表解题模板
    c++中的new、operator new、placement new
    树的前序、中序、后续、层次遍历的递归和非递归解法
    c++Volatile关键词
    南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
    c++右值引用以及使用
    c++选择重载函数
    从4行代码看右值引用
    被遗忘的C结构体打包技术
    南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
  • 原文地址:https://www.cnblogs.com/kerrycode/p/8875781.html
Copyright © 2011-2022 走看看