У меня SQL Server 2014 с максимальной памятью 6 ГБ (физическая память 8 ГБ).
Сервер памяти Target иногда 6GB , а затем падает обратно Общий сервер памяти (приблизительно 5.3GB, никогда не достигает 6GB). Я использовал committed_kb в sys.dm_os_sys_info , чтобы проверить память , используемую SQL Server.
Когда я наблюдаю за sys.dm_os_buffer_descriptors , я вижу, что страницы удаляются из кэша - но все еще остается 700 МБ памяти. Если бы ничто не требовало памяти, как бы вы объяснили тот факт, что страницы удаляются из кэша? Я ожидаю, что SQL Server удаляет страницы только тогда, когда ему нужна память.
Нераспределенные временные таблицы не являются проблемой на этом сервере. Мой PLE - 3632. Кэш процедуры - 2182 МБ.
Я ожидал бы, что страницы будут отбрасываться только тогда, когда не останется памяти, но у меня свободно 700 МБ, или я неправильно понял это?
Может кто-нибудь, пожалуйста, попытайтесь объяснить это поведение?
SQL Server также выполняет чтение с диска, поэтому я могу заключить, что не все необходимые страницы находятся в памяти.
Я провел еще несколько исследований и прочитал огромное количество страниц с диска в память и заметил что-то в диспетчере задач во время чтения:
- Объем используемой памяти составлял 7,0 ГБ -> 7,2 ГБ -> 7,0 ГБ -> 7,2 ГБ -> ...
- Sqlservr.exe вышел из 5,3 ГБ -> 5,5 ГБ -> 5,3 ГБ -> 5,5 ГБ -> ...
Это так же, как Windows не позволяет sqlservr.exe расти до 6 ГБ.
Я выполнил запрос, предоставленный 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
Это дало следующий результат:
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
Я не понимаю, почему Total_Memory_in_MB не равно 6144 (максимальный объем памяти)?
В sys.dm_os_ring_buffers я обнаружил RESOURCE_MEMPHYSICAL_LOW
, так что я думаю, что Windows не хватает памяти и SQL Server должен вернуть некоторые. Но доступно около 1 ГБ памяти => почему Windows сообщает, что у нее мало памяти?
<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>
Обновление
После еще одного исследования, почему всегда было доступно 1 ГБ памяти, я думаю, что-то нашел.
Возможно ли, что SQL Server может выделять только свободную память, а доступная память игнорируется? При запуске Process Explorer (Sysinternals) я увидел, что свободной памяти было 0.