Sql-Server
防止由於空閒工作執行緒修剪而導致 THREADPOOL 等待
在閱讀了 Josh Darnell 的Unusual THREADPOOL Waits之後,一位 Twitter 使用者提到有一個未記錄的跟踪標誌來防止修剪空閒的工作人員:
這個想法是,一旦 SQL Server 創建了足夠的執行緒來為峰值工作負載提供服務,它就不應該在 15 分鐘左右不需要的工作執行緒之後修剪工作執行緒(將它們釋放到作業系統)。
空閒的工作執行緒將繼續使用資源(例如記憶體),
THREADPOOL
但當突然需要更多工作人員時不會出現等待的爆發。顯然,這在使用 Always On 可用性組時會有所幫助。這個未記錄的跟踪標誌是什麼,它是如何工作的?
跟踪標誌是8061。
它沒有記錄,因此只能在 Microsoft 支持人員建議時啟用。
該標誌需要全域啟用(或在啟動時):
-- Enable globally DBCC TRACEON (8061, -1);
SQL Server 檢查它是否應該在以下位置修剪空閒的工作人員:
sqldk!SchedulerMonitor::CheckScheduler
如果設置了跟踪標誌 8061 ,它將跳過例行的多餘工人修整。
工人修整由以下人員執行:
sqldk!WorkDispatcher::TrimIdleWorkers
如果以下記憶體值大於零,仍將執行 Worker 修剪:
sqldk!SOS_OS::sm_WorkerPressureCount
非常正確,跟踪標誌不會阻止在所有情況下進行修剪,但它確實適用於問題中表達的目的。