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.