前言: 本文是對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):
- Waiting for a worker thread to become available
Abbreviated call stacks (list number matches known occurrences list):
- 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