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?
quelle
Antworten:
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:
Schalten Sie die virtuelle Maschine aus, bevor Sie die Speichereinstellungen konfigurieren.
Klicken Sie im vSphere-Client mit der rechten Maustaste auf eine virtuelle Maschine aus dem Inventar und wählen Sie Einstellungen bearbeiten.
Wählen Sie im Fenster Eigenschaften der virtuellen Maschine die Registerkarte Ressourcen und dann Speicher.
Aktivieren Sie im Bereich Ressourcenzuweisung das Kontrollkästchen Alle Gastspeicher reservieren (Alle gesperrt).
OK klicken.
Wenn Sie Microsoft Hyper-V verwenden, deaktivieren Sie den dynamischen Speicher für die VM mithilfe dieses Prozesses in Hyper-V Manager:
quelle
Einige Konfigurationsänderungen, die ich vornehmen würde:
Sie können das folgende Skript verwenden, um dies zu erreichen:
quelle