Monitorando Alta CPU através da RING BUFFER

Alto consumo de CPU, como monitorar? Recentemente, li um comentário interessante postado pelo Fernando Garcia no post Como Monitorar com Ring Buffer. Ele mencionou o uso do RING BUFFER para diagnosticar alto consumo de CPU. Isso é algo fantástico para um DBA que não tem acesso remoto ao servidor, ou seja, não pode abrir o Task Manager para ver o gráfico dos processadores.

Coloquei o script para rodar em produção e é fantástico, ele funciona muito bem! Fiz algumas alterações para otimizar sua performance. No final, ficou assim:

 WITH ScheduleMonitorResults AS
(
    SELECT 
      DATEADD(ms, 
        (select [ms_ticks]-[timestamp] from sys.dm_os_sys_info), 
        GETDATE())          AS 'EventDateTime', 
      CAST(record AS xml)   AS 'record'
    FROM sys.dm_os_ring_buffers
    WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR' 
    AND    [timestamp] > 
               (select [ms_ticks] - 10*60000  -- Last 10 minutes
                                  - 100       -- Round up 
                from sys.dm_os_sys_info)
)
SELECT 
    CONVERT (varchar, EventDateTime, 126) AS EventTime, 
    SysHealth.value('ProcessUtilization[1]','int') AS 'CPU (SQL Server)',
    100 - SysHealth.value('SystemIdle[1]','int') AS 'CPU (All Processes)'
FROM ScheduleMonitorResults CROSS APPLY 
    record.nodes('/Record/SchedulerMonitorEvent/SystemHealth') T(SysHealth)
ORDER BY EventDateTime DESC

O resultado fornece o histórico do consumo de CPU nos últimos 10 minutos.

image

Isso mostra que o consumo de CPU da máquina variou entre 5-25%, apesar do processo do SQL Server não consumir nada.