Share via


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.

Comments

  • Anonymous
    June 15, 2010
    Olá Fabrício, curto muito o seu blog e queria saber se tens presvisão de escrever um artigo mais detalhado sobre este assunto que acho muito útil. Por eqnaunto, podes dizer o que significa cada um desses:    * RESOURCE_MEMPHYSICAL_HIGH    * RESOURCE_MEMPHYSICAL_HIGH    * RESOURCE_MEM_STEADY    * RESOURCE_MEMVIRTUAL_LOW Abraço

  • Anonymous
    June 16, 2010
    Excelente pergunta! Imagine que o Resource Monitor seja uma máquina e que possui sensores, que determinam a quantidade de memória física e virtual. Esses sensores permitem responder com os sinais de HIGH, STEADY e LOW. A próxima pergunta é como que o Resource Monitor reage a esses eventos e pretendo escrever sobre isso. Enquanto isso, dá uma olhada nesse link: blogs.msdn.com/.../364523.aspx (Agora que percebi que repeti o RESOURCE_MEMPHYSICAL_HIGH no texto, mas já estou corrigindo)

  • Anonymous
    June 16, 2010
    Blz. Fico no aguardo pois o assunto é pouquíssimo divulgado, inclusive, a DMV sys.dm_os_ring_buffers é deprecated ( e não encontrei nenhuma que seja sua substituta ). Acho esta DNV muito útil e se puder explorar mais ficaria muito grato. Abraço

  • Anonymous
    June 25, 2010
    Com certeza, a view sys.dm_os_ring_buffers é interna (não exatamente deprecated) e está sujeita a alterações. Vou aproveitar para comentar sobre essa DMV sim! Obrigado pela idéia.