SQL Server verwendet nicht den gesamten Speicher

10

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.

Frederik Vanderhaegen
quelle

Antworten:

3

Zunächst muss ich sagen, dass Sie den maximalen Serverspeicher auf 6 GB und den Gesamtspeicher auf 8 GB festgelegt haben. Sie haben also nur 2 GB für das Betriebssystem übrig, was in vielen Fällen auch dann der Fall ist, wenn außer SQL Server auf einem Windows-Computer nichts installiert ist ist zu wenig Speicher für das Betriebssystem. 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).

Der 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 maximalen Serverspeicherwert auf 6 GB festgelegt haben. Es wird versucht, den gesamten Speicher zu verbrauchen, den es darf.

Der gesamte Serverspeicher kann SQL Server derzeit tatsächlich belegen. 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 den Ringpuffer abfragen , um zu überprüfen, ob eine Benachrichtigung über zu wenig Speicher 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 sys.dm_os_buffer_descriptors anzusehen . 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 sehen, was eine deterministische Methode zur Bewertung einer vernünftigen Pufferpoolgröße ist. und lesen Sie auch Benötigt SQL Server mehr RAM , um herauszufinden, wie viel RAM SQL Server benötigt und ob SQL Server unter Speicherdruck steht? Wenn Sie sicher sind, dass Seiten aus dem Pufferpool entfernt werden, ist SQL Server der Ansicht, dass Seiten verschoben werden müssen, da Speicherplatz für neue Seiten erforderlich ist. Ich bin mir nicht sicher, wie Sie die 700 MB kostenlos berechnet haben.

Eine andere Sache, schauen 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 Sperrseiten im Speicher 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 von SQL Server verwendeten Gesamtspeicher an (RAM + Auslagerungsdatei ). Der RAM ist tatsächlich ein verwendeter physischer Speicher oder ein festgeschriebener Speicher. Ein Teil des SQL Server-Prozesses wird auch auf die Festplatte ausgelagert. Dies stellt einen virtuellen Speicher oder eine Auslagerungsdatei dar. Wenn also der von SQL Server belegte Gesamtspeicher angezeigt wird, handelt es sich um die Summe aus physischem Speicher und Auslagerungsdatei.

Während die Spalte Physical_Memory_usedby_Sqlserver_MB nur der verwendete physische Speicher (Speicher, der durch physischen RAM oder festgeschriebenen Speicher gesichert ist) ist. Dies ist der Grund, warum beide unterschiedlich sind. Wenn Sie die reale Spalte sehen, wird zuerst der physische Speicher und der andere der festgeschriebene virtuelle Speicher verwendet.

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

HINWEIS: Der insgesamt verwendete Speicher ist größer als der verwendete physische Speicher.

Shanky
quelle
5

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 sich den Speicher DBCC MEMORYSTATUSund eine Vielzahl von DMVs genauer ansehen . Zielspeicher und Gesamtspeicher beziehen sich speziell auf den Pufferpool / Cache.

Auszug aus Christian Boltons wegweisenden Professional SQL Server 2008-Interna und Fehlerbehebung :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Dies zeigt 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 unter Target liegt , kann SQL Server den Pufferpool aufgrund des Speicherdrucks wahrscheinlich nicht vergrößern. In diesem Fall können Sie weitere Untersuchungen durchführen.
Mark Broadbent
quelle
Nur um hinzuzufügen, selbst wenn der Gesamt- und der Zielserverspeicher gleich sind, können wir nicht 100% sicher sein, dass kein Speicherdruck besteht. In diesem Fall müssen wir einige weitere Speicherzähler starten und auch deren Daten abrufen, um zu einer Schlussfolgerung zu gelangen.
Shanky
"Total und Target sollten auf einem Server ohne Speicherdruck, der seit einiger Zeit ausgeführt wird, nahezu identisch sein." Lassen Sie uns darüber nachdenken. Ich stelle einen neuen SQL Server mit 128 GB RAM auf und rufe eine einzelne 1 GB-Datenbank auf. Lass es einen Monat lang laufen. Soll ich wirklich glauben, dass Total und Target am Ende dieses Monats fast gleich sein werden? Wenn nicht, soll ich glauben, dass der Server unter Speicherdruck steht? Ich finde das schwer zu glauben.
Mike Sherrill 'Cat Recall'