У мене є 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 Гб .
Я запустив запит, наданий Шенкі:
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_buffersRESOURCE_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.