Question

After reading Unusual THREADPOOL Waits by Josh Darnell, a Twitter user mentioned there is an undocumented trace flag to prevent trimming idle workers:

tweet

The idea is that once SQL Server has created enough threads to service the peak workload, it should not then trim worker threads (release them to the OS) after 15 minutes or so of them not being needed.

The idle worker threads will continue to use resources (e.g. memory) but there will not be the burst of THREADPOOL waits when more workers are suddenly required. Apparently this can be of assistance when using Always On Availability Groups.

What is this undocumented trace flag, and how does it work?

Was it helpful?

Solution

The trace flag is 8061.

It is undocumented, so should only be enabled when suggested by Microsoft support.

The flag needs to be enabled globally (or on start up):

-- Enable globally
DBCC TRACEON (8061, -1);

SQL Server checks to see if it should trim idle workers in:

sqldk!SchedulerMonitor::CheckScheduler

It skips routine excess worker trimming if trace flag 8061 is set.

Worker trimming is performed by:

sqldk!WorkDispatcher::TrimIdleWorkers

Worker trimming will still be performed if the following memory value is greater than zero:

sqldk!SOS_OS::sm_WorkerPressureCount

Quite rightly, the trace flag will not prevent trimming under all scenarios, but it does work for the purpose expressed in the question.

Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange
scroll top