Probleme mit zu wenig Speicher unter SQL Server 2012 SP3

8

Ich hatte regelmäßig SQL Server-OOM-Fehler, einmal bis zu dem Punkt, an dem SQL Server sich selbst herunterfuhr und immer nachts auftrat, wenn niemand es verwendet und zu diesem Zeitpunkt kein SQL Agent-Job ausgeführt wurde:

Hier ist der typische Fehler:

17.08.2017 19: 31: 17, spid100, Unbekannt, Im Ressourcenpool 'intern' ist nicht genügend Systemspeicher vorhanden, um diese Abfrage auszuführen.

17.08.2017 19: 31: 17, spid100, Unbekannt, Fehler: 701 Schweregrad: 17 Status: 123.

17.08.2017 19: 31: 17, spid112, Unbekannt, Fehler: 18056 Schweregrad: 20 Status: 29. (Parameter :). Der Fehler wird im knappen Modus gedruckt, da beim Formatieren ein Fehler aufgetreten ist. Die Verfolgung von ETW-Benachrichtigungen usw. wird übersprungen.

Hier ist die Serverinfo:

  • 10 GB MIN SQL Server-Speicher
  • 21 GB maximaler SQL Server-Speicher
  • Nur 4 DBs auf dem Server
  • Ihre Größe beträgt jeweils nur 1 bis 2 GB
  • Die Tempdb-Größe ist nie auf mehr als 1 GB angewachsen (auf 10 GB eingestellt)
  • Die Indizes sind alle niedrig frag, Statistiken aktualisiert
  • Ausführung:

    Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
        Oct 20 2015 15:36:27 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
    

Ich habe mehrere Artikel überprüft:

  • DBCC Memorystatus
  • Schnelle Statistiken:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
    
  • Kein Ressourcen-Governor aktiviert:

    select pool_id, cache_memory_kb, used_memory_kb,
           out_of_memory_count,used_memgrant_kb
      from sys.dm_resource_governor_resource_pools
    
    Output:
    
    pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
    --------+-----------------+----------------+---------------------+-----------------
          1 |          295368 |         641416 |                   0 |                0
    
    
    select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
           (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
           (total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
           process_physical_memory_low,
           process_virtual_memory_low
      from sys. dm_os_process_memory
    
    Output:
    
    Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
    ----------------------------------------------------------------------------------------------------------------------------------------
                         20553 |                          20393 |       134217727 |                           0 |                          0
    

Der Server befindet sich auf SP3. Ich weiß, dass in SP1 ein Speicherverlust aufgetreten ist.

Hat jemand etwas im DBCC-Ergebnis bemerkt, auf das ich mich konzentrieren sollte?

user132852
quelle
1
Gibt es andere Dienste / Anwendungen, die auf diesem Server gehostet werden? Ist das SQL Server-Dienstkonto Teil der lokalen Sicherheitsrichtlinie für gesperrte Seiten im Speicher? Zeigen die Windows-Ereignisprotokolle andere Probleme an, als Sie den SQL Server-Absturz erlebten?
John Eisbrener
-Keine andere Anwendung, die auf diesem Server gehostet wird, ist ein dedizierter SQL-Server. -SQL Server Service Account ist Teil der Windows Admins-Gruppe. - Ich sehe nur eine Reihe von VSS-Fehlern: Volume Shadow Copy Service-Fehler: Unerwartete Fehlerabfrage für die IVssWriterCallback-Schnittstelle. hr = 0x80070005, Zugriff verweigert. . Dies wird häufig durch falsche Sicherheitseinstellungen im Writer- oder Requestor-Prozess verursacht. Vorgang: Sammeln von Writer-Daten Kontext: Writer-Klassen-ID: {35e81631-13e1-48db-97fc-d5bc721bb18a} Writer-Name: NPS VSS Writer Writer-Instanz-ID: {...}
user132852
1
Ist der Server eine VM? Wenn ja, verfügt es über "dedizierte" Speicherressourcen oder teilt es diese mit anderen VMs? Und wenn es Speicher teilt, ist die Verteilung der Speicherressourcen überlastet? Ich habe gesehen, dass dies (unabhängig von der Version) auf VM-Servern passiert, auf denen zu viel Speicher zugewiesen wurde.
SQL_Hacker
3
Danke Shanky. Nur zum Aktualisieren habe ich das Problem letzten Freitag gefunden, nachdem ich es zur Überwachung hinzugefügt habe. Es scheint, dass eine der App-Überwachungssitzungen in der Anwendung (von Drittanbietern) nicht richtig konfiguriert wurde. Die Verbindungssitzung wird erst Stunden später geschlossen, wenn der OOM tötet es.
user132852
1
@ user132852 Sie können Ihre Lösung in eine Antwort einfügen und als beantwortet markieren.
Thomas Kronawitter

Antworten:

2

Da der SQL Server in einer VM ausgeführt wird, wie durch den (hypervisor)Indikator in der Versionsanweisung angegeben, sollten Sie sicherstellen, dass auf dem Hostserver eine Speicherreservierung in VMWare (oder Hyper-V usw.) vorhanden ist.

Die Speicherreservierung sollte normalerweise 100% des Speichers betragen, der der VM für virtuelle SQL Server-Maschinen zugewiesen ist, die in einer Produktionsumgebung verwendet werden. Ohne eine Speicherreservierung kann der Host-Server mithilfe eines "Ballon-Treibers" zur Verwendung durch eine andere VM Speicher von der virtuellen Maschine "stehlen", was wahrscheinlich die Ursache für Ihren Mangel an Speicher ist.

So legen Sie in VMWare vCenter die Speicherreservierung auf einer virtuellen Maschine fest:

  1. Schalten Sie die virtuelle Maschine aus, bevor Sie die Speichereinstellungen konfigurieren.

  2. Klicken Sie im vSphere-Client mit der rechten Maustaste auf eine virtuelle Maschine aus dem Inventar und wählen Sie Einstellungen bearbeiten.

  3. Wählen Sie im Fenster Eigenschaften der virtuellen Maschine die Registerkarte Ressourcen und dann Speicher.

  4. Aktivieren Sie im Bereich Ressourcenzuweisung das Kontrollkästchen Alle Gastspeicher reservieren (Alle gesperrt).

  5. OK klicken.

Wenn Sie Microsoft Hyper-V verwenden, deaktivieren Sie den dynamischen Speicher für die VM mithilfe dieses Prozesses in Hyper-V Manager:

  1. Stellen Sie sicher, dass die VM ausgeschaltet ist.
  2. Klicken Sie mit der rechten Maustaste auf die VM und wählen Sie "Einstellungen".
  3. Wählen Sie im linken Bereich "Speicher".
  4. Stellen Sie sicher, dass "Dynamischen Speicher aktivieren" nicht aktiviert ist.
  5. Starten Sie die VM.
Max Vernon
quelle
1

Einige Konfigurationsänderungen, die ich vornehmen würde:

  1. Entfernen Sie die minimalen Speichereinstellungen, dies ist buchstäblich nicht erforderlich .
    • Der Grund, warum Sie dies ändern möchten, liegt darin, dass SQL Server den Speicher unter der Marke niemals freigibt, wenn dies festgelegt ist. Sollten Seiten im Speicher gesperrt werden, kann der Speicher nicht mehr ausgelagert werden.
  2. Passen Sie den maximalen Serverspeicher auf 75% der Gesamtsumme für insgesamt <32 GB oder 87,5% für insgesamt> 32 GB an.
    • Angenommen, SQL Server ist das einzige, was auf dem Computer ausgeführt wird, lassen Sie ihn den verbleibenden Speicherplatz belegen, nachdem Sie dem Betriebssystem ausreichend Speicher für den ordnungsgemäßen Betrieb zugewiesen haben.

Sie können das folgende Skript verwenden, um dies zu erreichen:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
Zuhälter
quelle
3
Ich weiß, dass dies ziemlich übliche Best Practices sind, aber können Sie ein wenig erklären, wie das Ändern dieser Methoden bei dem Fehler hilft, auf den sie stoßen?
Erik Darling