Eu tenho o SQL Server 2014 com memória máxima definida como 6 GB (a memória física é 8 GB).
A memória do servidor alvo é, por vezes, 6GB e depois cai de volta ao Servidor Memória Total (aproximadamente 5.3GB, nunca atinge 6GB). Eu costumava committed_kb em sys.dm_os_sys_info para verificar a memória usada pelo SQL Server.
Ao monitorar sys.dm_os_buffer_descriptors , vejo que as páginas são descartadas do cache - mas ainda resta 700 MB de memória. Se nada precisasse da memória, como você explicaria o fato de as páginas serem removidas do cache? Eu esperaria que o SQL Server apenas remova as páginas quando precisar de memória.
Tabelas temporárias desalocadas não são um problema neste servidor. Meu PLE é 3632. O cache do procedimento é 2182 MB.
Eu esperava que as páginas fossem descartadas apenas quando não restasse memória, mas tenho 700 MB livres ou estou entendendo isso errado?
Alguém por favor pode tentar explicar esse comportamento?
O SQL Server também está lendo do disco, então acho que posso concluir que nem todas as páginas necessárias estão na memória.
Pesquisei um pouco mais e li uma quantidade enorme de páginas do disco na memória e notei algo no gerenciador de tarefas durante as leituras:
- A memória em uso passou de 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
- Sqlservr.exe passou de 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...
É como se o Windows não permitisse que o sqlservr.exe aumentasse para 6 GB.
Eu executei a consulta fornecida por Shanky:
select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory
Isso deu o seguinte resultado:
Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0
O que eu não entendo é por que Total_Memory_in_MB não é igual a 6144 (memória máxima)?
Em sys.dm_os_ring_buffers que encontrei RESOURCE_MEMPHYSICAL_LOW
, acho que o Windows está com pouca memória e o SQL Server deve retornar alguns. Mas há aproximadamente 1 GB de memória disponível => por que o Windows está dizendo que está com pouca memória?
<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">
<ResourceMonitor>
<Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
<IndicatorsProcess>0</IndicatorsProcess>
<IndicatorsSystem>2</IndicatorsSystem>
<NodeId>0</NodeId>
<Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
<Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
<Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>
</ResourceMonitor>
<MemoryNode id="0">
<TargetMemory>6050080</TargetMemory>
<ReservedMemory>67208656</ReservedMemory>
<CommittedMemory>5423548</CommittedMemory>
<SharedMemory>0</SharedMemory>
<AWEMemory>0</AWEMemory>
<PagesMemory>4975656</PagesMemory>
</MemoryNode>
<MemoryRecord>
<MemoryUtilization>100</MemoryUtilization>
<TotalPhysicalMemory>8387608</TotalPhysicalMemory>
<AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
<TotalPageFile>11142348</TotalPageFile>
<AvailablePageFile>2887916</AvailablePageFile>
<TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
<AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
<AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
</MemoryRecord>
</Record>
Atualização
Depois de mais algumas pesquisas sobre por que sempre havia 1 GB de memória disponível, acho que encontrei algo.
É possível que o SQL Server possa alocar apenas memória livre e que a memória disponível seja ignorada? Ao executar o Process Explorer (Sysinternals), vi que a memória livre era 0.