Mam SQL Server 2014 z maksymalną pamięcią ustawioną na 6 GB (pamięć fizyczna to 8 GB).
Target Server Pamięć bywa 6GB, a następnie powraca do Całkowita Server Memory (około 5.3GB, nigdy nie osiągnie 6GB). Kiedyś committed_kb w sys.dm_os_sys_info aby sprawdzić pamięć używaną przez SQL Server.
Kiedy monitoruję sys.dm_os_buffer_descriptors , widzę, że strony są usuwane z pamięci podręcznej - ale wciąż pozostaje 700 MB pamięci. Gdyby nic nie potrzebowało pamięci, jak wyjaśniłbyś fakt, że strony są usuwane z pamięci podręcznej? Spodziewałbym się, że SQL Server usuwa strony tylko wtedy, gdy potrzebuje pamięci.
Zwolnione tabele tymczasowe nie stanowią problemu na tym serwerze. Moje PLE to 3632. Pamięć podręczna procedury wynosi 2182 MB.
Spodziewałbym się, że strony zostaną upuszczone tylko wtedy, gdy nie ma już pamięci, ale mam 700 MB wolnego miejsca, czy też źle to rozumiem?
Czy ktoś może spróbować wyjaśnić to zachowanie?
SQL Server również odczytuje z dysku, więc myślę, że mogę dojść do wniosku, że nie wszystkie potrzebne strony są w pamięci.
Zrobiłem trochę więcej badań i przeczytałem ogromną liczbę stron z dysku do pamięci i zauważyłem coś w menedżerze zadań podczas odczytów:
- Używana pamięć wzrosła z 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
- Sqlservr.exe przeszedł z 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...
To tak, jakby Windows nie pozwalał sqlservr.exe powiększyć się do 6 GB.
Uruchomiłem zapytanie dostarczone przez 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
To dało następujący wynik:
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
Nie rozumiem, dlaczego Total_Memory_in_MB nie jest równy 6144 (maksymalna pamięć)?
W sys.dm_os_ring_buffers znalazłem RESOURCE_MEMPHYSICAL_LOW
, więc myślę, że w systemie Windows zaczynało brakować pamięci, a SQL Server musi zwrócić trochę. Ale jest dostępny około 1 GB pamięci => dlaczego system Windows informuje, że zaczyna brakować pamięci?
<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>
Aktualizacja
Po kilku dalszych badaniach, dlaczego zawsze była dostępna 1 GB pamięci, myślę, że coś znalazłem.
Czy to możliwe, że SQL Server może przydzielić tylko wolną pamięć, a dostępna pamięć jest ignorowana? Podczas uruchamiania Process Explorer (Sysinternals) widziałem, że wolna pamięć wynosi 0.