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.
- Script Disponível em SQL High CPU scenario troubleshooting
- Encontrei o mesmo código dentro do SQL Server 2005 Performance Statistics Script, o famoso PerfStats
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.
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.