it-swarm.com.de

SQL Server verwendet nicht den gesamten Speicher

Ich habe SQL Server 2014 mit max Speicher auf 6 GB eingestellt (physischer Speicher ist 8 GB).

Der Zielserverspeicher beträgt manchmal 6 GB und fällt dann auf Gesamter Serverspeicher zurück (ca. 5,3 GB, erreicht nie 6 GB). Ich habe commit_kb in sys.dm_os_sys_info verwendet, um den von SQL Server verwendeten Speicher 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 wachsen 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 fand ich RESOURCE_MEMPHYSICAL_LOW, also 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.

10

Zunächst muss ich sagen, dass Sie maximaler Serverspeicher auf 6 GB und Gesamtspeicher auf 8 GB eingestellt haben, sodass Sie gerade 2 GB für das Betriebssystem übrig haben. In vielen Fällen wird dem Betriebssystem zu wenig Speicher zur Verfügung gestellt, selbst wenn außer SQL Server auf einem Windows-Computer nichts installiert ist. Auf einem System mit installiertem Antivirenprogramm muss dem Betriebssystem mindestens 4 GB zugewiesen werden, damit es ordnungsgemäß funktioniert. Ich lasse sofort 2 GB für das Betriebssystem und 1,5 G für AV.

Der Zielserverspeicher beträgt manchmal 6 GB und fällt dann auf den Gesamtserverspeicher zurück (ca. 5,3 GB, erreicht nie 6 GB).

Zielserverspeicher gibt an, wie viel Speicher SQL Server benötigt, um im Idealfall ordnungsgemäß zu funktionieren. Der Zielserverspeicher versucht, 6 GB zu sein, da Sie den Wert max Serverspeicher auf 6 GB festgelegt haben. Es wird versucht, den gesamten Speicher zu verbrauchen, den es darf.

Gesamter Serverspeicher ist das, was SQL Server derzeit tatsächlich verbrauchen kann. Dies ist festgeschriebener Speicher und wird durch physischen RAM gesichert. Dies sind in Ihrem Fall maximal 5,5 GB.

SQL Server versucht, den Speicherverbrauch zu erhöhen. Nach Erreichen von 5,3 oder 5,5 GB fordert das Betriebssystem SQL Server jedoch auf, den Speicherverbrauch nicht weiter zu erhöhen, und weist möglicherweise auf eine Benachrichtigung über geringen Speicherplatz hin. Dies geschieht, weil das Betriebssystem möglicherweise mit wenig Arbeitsspeicher konfrontiert ist, wie oben bereits erwähnt. SQLOS reagiert, wenn das Windows-Betriebssystem unter Speicherdruck steht, indem es die Caches auffordert, den Verbrauch zu senken. Sie können Ring Buffer abfragen , um zu überprüfen, ob eine Benachrichtigung über geringen Speicherplatz signalisiert wurde. Ich muss DMV hinzufügen sys.dm_os_ring_buffer ist nicht dokumentiert, aber sicher.

Ich sehe, 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.

Wenn Sie nach freiem Speicher suchen, würde ich Ihnen nicht empfehlen , sich die DMV anzusehen sys.dm_os_buffer_descriptors. Der Betriebssystemzähler Available Mbytes gibt an, wie viel physischer Speicher in Byte für Prozesse verfügbar ist, die auf dem Computer ausgeführt werden. Ich schlage vor, dass Sie auch Was ist eine deterministische Methode zur Bewertung einer vernünftigen Pufferpoolgröße? und auch lesen Benötigt SQL Server mehr RAM , um herauszufinden, wie viel RAM SQL Server benötigt und wenn SQL Server Speicherdruck ausgesetzt ist. Wenn Sie sicher sind, dass Seiten aus dem Pufferpool entfernt werden, ist SQL Server der Ansicht, dass Seiten verschoben werden müssen, weil sie Speicherplatz benötigen Ich bin mir nicht sicher, wie Sie die 700 MB kostenlos berechnet haben.

Eine andere Sache, sehen Sie sich bitte nicht den Task-Manager für den SQL Server-Speicherverbrauch an. Sie erhalten nicht immer den richtigen Wert, insbesondere wenn das SQL Server-Dienstkonto über die Berechtigung Seiten im Speicher sperren verfügt. In Ihrem Fall, selbst wenn SQL Server einen maximalen Serverspeicher von 6 GB hat, erhält das Betriebssystem nur 2 GB, was SQL Server dazu zwingt, seinen Verbrauch nicht zu erhöhen, da 2 GB für SQL Server niedrig sind. Gibt es etwas anderes als SQL Server, das auf dem System ausgeführt wird?

Wenn Sie den SQL Server-Speicherverbrauch berechnen möchten, verwenden Sie bitte:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Was ich nicht verstehe ist, warum Total_Memory_in_MB nicht gleich 6144 (maximaler Speicher) ist.

Die Spalte Total_Memory_in_MB gibt den Gesamtspeicher an, der von SQL Server verwendet wird (RAM + Auslagerungsdatei). Das RAM ist tatsächlich verwendeter physischer Speicher oder festgeschriebener Speicher. Ein Teil des SQL Server-Prozesses wird auch auf die Festplatte ausgelagert und stellt sich als virtueller Speicher oder Auslagerungsdatei dar. Wenn Sie also TOTAL sehen möchten Der von SQL Server verbrauchte Speicher ist die Summe aus physischem Speicher und der Auslagerungsdatei.

Während die Spalte Physical_Memory_usedby_Sqlserver_MB nur der verwendete physische Speicher (Speicher, der durch physische RAM oder festgeschriebener Speicher) unterstützt wird) ist. Dies ist der Grund, warum beide unterschiedlich sind Siehe die reale Spalte. Die erste ist der verwendete physische Speicher und die andere ist der festgeschriebene virtuelle Speicher.

Wenn Sie ausgelagerten Speicher sehen möchten, ist dies der Unterschied zwischen Total_Memory_in_MB und Physical_Memory_usedby_Sqlserver_MB.

HINWEIS: Der insgesamt verwendete Speicher wäre größer als der verwendete physische Speicher.

3
Shanky

SQL Server verwendet viel mehr Caches als den Puffercache, obwohl dies bei weitem der größte ist (ein offensichtliches Beispiel ist der Plan-Cache). Sie können den Speicher über DBCC MEMORYSTATUS Und eine Vielzahl von DMVs genauer betrachten. Zielspeicher und Gesamtspeicher beziehen sich speziell auf den Pufferpool/Cache.

Auszug aus Christian Bolton 's wegweisendem Professional SQL Server 2008 Interna und Fehlerbehebung :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Dies gibt die aktuelle Größe des Pufferpools an.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Dies gibt die ideale Größe für den Pufferpool an. Total und Target sollten auf einem Server ohne Speicherdruck, der seit einiger Zeit ausgeführt wird, nahezu identisch sein. Wenn Total deutlich kleiner als Ziel ist, kann SQL Server den Pufferpool aufgrund des Speicherdrucks wahrscheinlich nicht vergrößern. In diesem Fall können Sie weitere Untersuchungen durchführen.
5
Mark Broadbent