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çoAnonymous
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çoAnonymous
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.