Checking for CPU pressure via sys.dm_os_schedulers
Do you suspect you are encountering CPU pressure? Some of the more common signs of CPU pressure include:
- Sustained "% Processor Time" values (>75% for extended periods)
- High signal wait time percentage from sys.dm_os_wait_stats
- SOS_SCHEDULER_YIELD waits
One way to measure if you have several tasks waiting for CPU time is to query the sys.dm_os_schedulers DMV. This DMV has several interesting columns - however one in particular is useful for measuring queued tasks - the "runnable_tasks_count" column. The "runnable_tasks_count" value indicates the count of workers that have tasks assigned to them that are just waiting for their share of time on the scheduler (logical CPU). I checked various busy OLTP hosting SQL Server instances, and even though these systems are quite active, the value for runnable_tasks_count was very low (almost always showing zero values).
Yesterday I did encounter a SQL Server instance where the value of runnable_tasks_count averaged about 13 across all schedulers with a status of "VISIBLE ONLINE". The value of runnable_tasks_count should be as low as possible - and if it shows ongoing non-zero values, you have further evidence of CPU pressure.