Ich habe SQL Server 2014 mit maximalem Speicher auf 6 GB eingestellt (physischer Speicher ist 8 GB).
Der Zielserver - Speicher ist manchmal 6GB und fällt dann wieder auf Total Server - Speicher (ca. 5.3GB, nie erreicht 6GB). Ich benutzen committed_kb in sys.dm_os_sys_info den Speicher von SQL Server verwendet zu überprüfen.
Wenn ich sys.dm_os_buffer_descriptors überwache, sehe ich, dass Seiten aus dem Cache gelöscht werden - aber es sind noch 700 MB Speicher übrig. Wenn nichts den Speicher benötigt, wie würden Sie die Tatsache erklären, dass Seiten aus dem Cache entfernt werden? Ich würde erwarten, dass SQL Server Seiten nur entfernt, wenn es Speicher benötigt.
Freigegebene temporäre Tabellen sind auf diesem Server kein Problem. Mein PLE ist 3632. Der Prozedur-Cache ist 2182 MB.
Ich würde erwarten, dass Seiten nur gelöscht werden, wenn kein Speicher mehr vorhanden ist, aber ich habe 700 MB frei oder verstehe ich das falsch?
Kann jemand bitte versuchen, dieses Verhalten zu erklären?
SQL Server liest auch von der Festplatte, daher kann ich zu dem Schluss kommen, dass sich nicht alle benötigten Seiten im Speicher befinden.
Ich habe etwas mehr recherchiert und eine große Anzahl von Seiten von der Festplatte in den Speicher gelesen und beim Lesen etwas im Taskmanager bemerkt:
- Der verwendete Speicher ging von 7,0 GB -> 7,2 GB -> 7,0 GB -> 7,2 GB -> ...
- Sqlservr.exe ging von 5,3 GB -> 5,5 GB -> 5,3 GB -> 5,5 GB -> ...
Es ist so, als würde Windows sqlservr.exe nicht auf 6 GB anwachsen lassen .
Ich habe die von Shanky bereitgestellte Abfrage ausgeführt:
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
Dies ergab das folgende Ergebnis:
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
Was ich nicht verstehe ist, warum Total_Memory_in_MB nicht gleich 6144 (maximaler Speicher) ist?
In sys.dm_os_ring_buffers habe ich gefunden RESOURCE_MEMPHYSICAL_LOW
, daher denke ich, dass Windows nicht genügend Arbeitsspeicher hat und SQL Server einige zurückgeben muss. Es ist jedoch ca. 1 GB Arbeitsspeicher verfügbar => Warum meldet Windows, dass der Arbeitsspeicher knapp wird?
<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>
Update
Nach einigen weiteren Nachforschungen, warum immer 1 GB Speicher verfügbar war, habe ich etwas gefunden.
Ist es möglich, dass SQL Server nur freien Speicher zuweisen kann und der verfügbare Speicher ignoriert wird? Beim Ausführen von Process Explorer (Sysinternals) sah ich, dass der freie Speicher 0 war.