Dicas para um DBA Iniciante – Utilização histórica de CPU

Galera, tudo bem com vocês?

No vídeo de hoje quero demonstrar para vocês como resolve um problema real de performance em um cliente utilizando a sessão de monitoração system_health.

Caso tenham interesse em reproduzir o cenário descrito no vídeo, basta utilizar o script abaixo:


DECLARE @ts_now bigint

SELECT @ts_now = cpu_ticks / (cpu_ticks/ms_ticks)  FROM sys.dm_os_sys_info
SELECT top 20 record_id, EventTime,
CASE WHEN system_cpu_utilization_post_sp2 IS NOT NULL THEN system_cpu_utilization_post_sp2 ELSE system_cpu_utilization_pre_sp2 END AS system_cpu_utilization,
CASE WHEN sql_cpu_utilization_post_sp2 IS NOT NULL THEN sql_cpu_utilization_post_sp2 ELSE sql_cpu_utilization_pre_sp2 END AS sql_cpu_utilization
FROM
(
SELECT
record.value('(Record/@id)[1]', 'int') AS record_id,
DATEADD (ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS EventTime,
100-record.value('(Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS system_cpu_utilization_post_sp2,
record.value('(Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS sql_cpu_utilization_post_sp2 ,
100-record.value('(Record/SchedluerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS system_cpu_utilization_pre_sp2,
record.value('(Record/SchedluerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS sql_cpu_utilization_pre_sp2
FROM (
SELECT timestamp, CONVERT (xml, record) AS record
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'
AND record LIKE '%<SystemHealth>%') AS t
) AS t
ORDER BY record_id desc

Espero que gostem e não deixem de inscreverem-se no blog, no canal do youtube e no grupo de discussão SQLManiacs.

Grande abraço a todos.

16 ideias sobre “Dicas para um DBA Iniciante – Utilização histórica de CPU

  1. Pingback: Dicas para um DBA Iniciante – Utilizações histórica de CPU – DBA Brasil

  2. Pingback: Dicas para um DBA Iniciante – Utilizações histórica de CPU | DBA4All

  3. Felipe

    Vitão, sempre com ótimas contribuições.
    Tenho uma duvidas:
    Quando tenho mais de uma instancia, a contagem é feita por cada uma ou é baseada na utilização total do serviço do SQLServer no servidor?

    Abs

    Resposta
    1. Vitor Fava Autor do post

      Fala grande Felipe, tudo bem?
      A utilização de CPU do sistema é geral e a utilização pelo SQL Server é da instância na qual estiver executando o comando.
      Grande abraço.

      Resposta
  4. Anderson

    Grande Vitor! Como sempre elevando o nível de suas apresentações, seja nos assuntos abordados com total conhecimento, seja nos recursos para facilitar ainda mais nosso entendimento. Eu utilizo uma query pontual para pegar essas informações:

    WITH ScheduleMonitorResults AS
    (
    SELECT
    DATEADD(ms,
    (select [timestamp]-[ms_ticks] 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] – 20*60000 — Last 20 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

    Que como pode observar faço um cross apply com a SysHealth.

    Um assunto interessante para um próximo video, seria o Baseline, pois como você mesmo disse, nesse cliente não tinha, e certamente muitos que assistem seus videos podem estar nessa mesma pegada. Eu criei baselines baseados no livro do Louis Davidson e Tim Ford (Performance Tuning with SQL Server Dynamic Management Views). São muitos contadores, mas implementei somente alguns, para não gerar muitos dados. Parabéns!!

    Resposta
    1. Vitor Fava Autor do post

      Fala grande Anderson, tudo bem contigo meu amigo?
      Muito obrigado por sempre acompanhar o conteúdo que disponibilizo.
      Sua consulta é muito bacana mesmo viu.
      Com certeza abordarei o assunto em futuros vídeos sim.
      Grande abraço.

      Resposta
  5. Heitor Arantes

    Boa tarde, Vitor!

    Seus videos são sempre muito bem explicados, e ainda trazendo um cenário real e melhor ainda, e neste caso que você passou todos os administradores de bd passam por este cenário.

    Tenho uma duvida:
    Este tipo de monitoração (System Health) pode ser executada em uma instância no Sql Azure ?

    Abs.

    Resposta
  6. Jefferson

    vítor em outras versões como por exemplo 2014 ou 2012 funciona ? fiz no 2014 mais não retornou nenhum dado.

    Resposta
  7. Magrão

    Valeu Vitor!
    Muito legal o material!

    O povo pode usar LIKE ‘%%’ em vez de LIKE ‘%<SystemHealth>%’.
    Ajudou pra mim.

    Abs

    Resposta
    1. Magrão

      Opa foi mal! O sistema postou errado. Queria falar que tem que corrigir o filtro com LIKE ‘%%’. E agora no script tem html lt and gt.

      Abs

      Resposta

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.