Freigeben über


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.

Comments

  • Anonymous
    August 12, 2011
    Mais uma vez um Excelente artigo Fabricio . Obs : Acredito que 1º query o correto seria [timestamp]-[ms_ticks] .

  • Anonymous
    August 12, 2011
    Correto. Os campos da primeira query devem ser invertidos, [timestamp] - [ms_ticks]. Assim que der, farei a mudança no post... no momento, o editor não está funcionando (!!!). Muito obrigado por encontrar esse erro.