SQL SERVER – Query for CPU Pressure

Today’s blog post is inspired by my earlier blog post SQL SERVER – Measure CPU Pressure – Detect CPU Pressure. I was recently asked during one of the consulting engagement Comprehensive Database Performance Health Check how do I actually measure the CPU for the entire server. In today’s blog post we will discuss Query for CPU Pressure.

SQL SERVER - Query for CPU Pressure cpupressure-800x230

Query 1: Average CPU Load

SELECT COUNT(*) Schedulers,
AVG(current_tasks_count) AS [Avg Current Task Count],
AVG(runnable_tasks_count) AS [Avg Runnable Task Count],
AVG(work_queue_count) AS [Avg Work Queue Count],
AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count],
AVG(current_workers_count) AS [Avg Current Worker Count],
AVG(active_workers_count) AS [Avg Active Worker Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255;

Query 2: Total CPU Load

SELECT COUNT(*) Schedulers,
SUM(current_tasks_count) AS [Sum Current Task Count],
SUM(runnable_tasks_count) AS [Sum Runnable Task Count],
SUM(work_queue_count) AS [Sum Work Queue Count],
SUM(pending_disk_io_count) AS [Sum Pending DiskIO Count],
SUM(current_workers_count) AS [Sum Current Worker Count],
SUM(active_workers_count) AS [Sum Active Worker Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255;

current_tasks_count is the number of counts of the currently running task. However, we should give the utmost consideration to runnable_tasks_count. If this number is higher, it indicates that a large number of queries, which are assigned to the scheduler for processing, are waiting for its turn to run. This gives a clear indication of the CPU pressure. Additionally, count pending_disk_io_count displays the tasks that are yet to be processed in the scheduler. For better processing, this count is expected not to be very high.

When we say that the numbers are high or low, it does not make any sense unless we compare it to a standard or any other known count. Therefore, here, these numbers are compared to the worker counts (current_worker_count). If current_worker_count is 24 and there are 1000 tasks in queue, then this is not a good scenario. Thus, you can always look at the numbers and make your own judgment here.

Here are six-part blog post series I have written based on my last 10 years of experience helping with the Comprehensive Database Performance Health Check. I strongly recommend you to read them as they walk you through my business model.

Summary: CPU Pressure

When you see more a huge value in the Average Runnable Task, you do have a CPU pressure. When you see a huge value in Average Pending DiskIO, you do have an IO Pressure.

Reference: Pinal Dave (http://blog.SQLAuthority.com)

CPU Threads, SQL CPU, SQL DMV, SQL Scripts, SQL Server
Previous Post
SQL SERVER – Capturing Execution Plan for Canceled Query
Next Post
SQL SERVER – Query Store Status for All the Databases

Related Posts

Leave a Reply