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