Resource Monitor: Notifications

Durante o TechEd 2009, ouvi um comentário do Fernando Garcia (gente fina!) sobre o diagnóstico de problemas de falta de memória usando a DMV: dm_os_ring_buffer e filtrando por registros do tipo RING_BUFFER_RESOURCE_MONITOR. Afinal, que tipo de informação fica armazenada?

 

 SELECT * FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
ORDER BY timestamp DESC
 A primeira parte do resultado descreve qual o tipo de notificação.<Record id="0" type="RING_BUFFER_RESOURCE_MONITOR" time="146278552">
  <ResourceMonitor>
    <Notification>RESOURCE_MEMPHYSICAL_HIGH</Notification>
    <IndicatorsProcess>0</IndicatorsProcess>
    <IndicatorsSystem>1</IndicatorsSystem>
    <NodeId>0</NodeId>
    <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
    <Effect type="APPLY_HIGHPM" state="EFFECT_ON" reversed="0">0</Effect>
    <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>
  </ResourceMonitor>

Os eventos possíveis são:

  • RESOURCE_MEMPHYSICAL_HIGH
  • RESOURCE_MEMPHYSICAL_LOW
  • RESOURCE_MEM_STEADY
  • RESOURCE_MEMVIRTUAL_LOW

Esses eventos podem ser internos/externos à instância do SQL Server, conforme a indicação dos campos:

  • IndicatorsProcess
  • IndicatorsSystem

Resource Monitor fará o broadcast dessa notificação para todos os componentes de memória.

A segunda parte detalha cada um dos Memory Nodes, apresentando a distribuição de memória entre os “Allocators”.

  <MemoryNode id="0">
    <ReservedMemory>6282232</ReservedMemory>
    <CommittedMemory>38712</CommittedMemory>
    <SharedMemory>0</SharedMemory>
    <AWEMemory>8192</AWEMemory>
    <SinglePagesMemory>3208</SinglePagesMemory>
    <MultiplePagesMemory>21896</MultiplePagesMemory>
  </MemoryNode>

 

A terceira parte apresenta informações importantes sobre o status do Sistema Operacional e do processo do SQL Server.

  <MemoryRecord>
    <MemoryUtilization>100</MemoryUtilization>
    <TotalPhysicalMemory>6222536</TotalPhysicalMemory>
    <AvailablePhysicalMemory>3044516</AvailablePhysicalMemory>
    <TotalPageFile>12665292</TotalPageFile>
    <AvailablePageFile>9388376</AvailablePageFile>
    <TotalVirtualAddressSpace>8589934464</TotalVirtualAddressSpace>
    <AvailableVirtualAddressSpace>8583481552</AvailableVirtualAddressSpace>
    <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace>
  </MemoryRecord>
</Record>

Descrição dos campos:

  • MemoryUtilization: Utilização de memória RAM pelo SQL Server
  • TotalPhysicalMemory: Quantidade total de memória RAM
  • AvailablePhysicalMemory: Memória RAM disponível
  • TotalPageFile: Quantidade total de committed memory
  • AvailablePageFile: Quantidade de committed memory disponível
  • TotalVirtualAddressSpace: Espaço virtual do processo
  • AvailableVirtualAddressSpace: Espaço virtual disponível

A próxima pergunta é como analisar? Não responderei isso nesse post.. mas pretendo em breve descrever como funciona o Resource Monitor e o gerenciamento de memória do SQL Server.