Ich habe eine Instanz von SQL Server 2012 SP2 Enterprise Edition, die ~ 20 GB Arbeitsspeicher über dem Maximalwert verbraucht. Speicherlimit. Die Instanz ist auf 65 GB beschränkt, der in der folgenden Abfrage verwendete physische Speicher zeigt jedoch 86 GB an
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Der Server ist physisch mit 2 NUMA-Knoten. Gibt es eine Möglichkeit, herauszufinden, was den Speicher außerhalb des Pufferpools verbraucht (ich gehe davon aus, dass genau das passiert)?
Hier ist die Ausgabe von DBCC MEMORYSTATUS: -
Und hier ist das festgelegte Speicherlimit: -
Danke im Voraus.
UPDATE: - Ich habe die von Aaron vorgeschlagene Abfrage ausgeführt
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Hier ist die Ausgabe: -
Die Summe von pages_kb beträgt ~ 60 GB
UPDATE 2: - Die vollständige Ausgabe von DBCC MEMORYSTATUS finden Sie hier: - http://pastebin.com/nGn6kXEc
UPDATE 3: - Ausgabe von Shankys Skripten in Excel-Datei hier: - http://jmp.sh/LKRlH4K
UPDATE 4: - Screenshot der Ausgabe von: -
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Dies scheint also darauf hinzudeuten, dass SQL Server mehr als 65 GB verwendet.
quelle
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Antworten:
Max Server - Speicher steuert Pufferpool und alle Seitengrößen Zuweisungen, aber immer noch nicht unter Kontrolle hält Dinge wie direkte Windows - Zuweisungen (verknüpfte Server, sp_OA, XPs), Speicher erforderlich für Gewinde / Thread - Stacks, etc .
Sie können wahrscheinlich erwarten, dass dies bei NUMA höher ist (obwohl ich nicht sicher bin, ob 20 GB normal sind); Der Punkt ist, dass Sie nicht erwarten können, dass der maximale Serverspeicher den von einer Instanz von SQL Server verwendeten Speicher vollständig steuert. Wenn Sie möchten, dass die gesamte Instanz (nicht nur Pufferpool, Plan-Caches und CLR) nicht mehr als 64 GB verwendet, sollten Sie den maximalen Serverspeicher auf einen niedrigeren Wert einstellen.
Einige mögliche Ideen, um dies aufzuspüren (ich werde alles auf MB normalisieren):
Leistungsindikatoren
Sehen Sie, ob hier etwas zu groß herausspringt:
Top 20 Angestellten
Sie haben dies bereits getan, aber der Vollständigkeit halber:
Fadenstapelgröße
Stellen Sie zunächst sicher, dass dies Null und keine benutzerdefinierte Zahl ist (wenn es nicht 0 ist, finden Sie heraus, warum und beheben Sie es):
Sie können aber auch sehen, wie viel Speicher von Thread-Stacks belegt wird, indem Sie Folgendes verwenden:
Module von Drittanbietern geladen
speicherbezogene DMVs
Möglicherweise können Sie bei diesen DMVs auch etwas Außergewöhnliches erkennen:
Dieser Artikel wurde vor SQL Server 2012 geschrieben, daher müssen möglicherweise einige Spaltennamen und Berechnungen angepasst werden, es gibt jedoch auch andere Möglichkeiten, dies zu versuchen:
Einige gute Hintergrundinformationen auch in einem anderen Artikel auf dieser Website:
Einige gute Informationen zu den Arten von Dingen, die Speicher außerhalb von verwenden
max server memory
(aber keine guten Daten darüber, wie die tatsächliche Nutzung erfasst wird):quelle
Ich habe von Bob Dorr die folgende Definition erhalten, was der maximale Serverspeicher in SQL Server 2012 steuert. Sie können auch Books Online lesen, um weitere Informationen zu erhalten
Der für den Thread-Stack zugewiesene Speicher, die DLL eines Drittanbieters, der andere als der von Microsoft (wie MySQL.PostgreSQL usw.) verbundene Verbindungsanbieter oder eine im SQL Server-Adressraum geladene DLL, die kein SQL Server ist, wird außerhalb des maximalen Serverspeichers zugewiesen. Dem IIRC-Sicherungsvorgang in SQL Server 2012 wird auch weiterhin Speicher außerhalb des Pufferpools zugewiesen.
Verwenden Sie einen Verbindungsserver, um andere RDBMS abzufragen? Jede andere Software, die auf demselben Windows-Computer installiert ist. Können Sie die Ausgabe der folgenden Abfragen an einem freigegebenen Speicherort veröffentlichen?
Können Sie auch die vollständige
DBCC MMEMORYSTATUS
Ausgabe an einem freigegebenen Ort hochladen und den Link hier posten? Dies würde helfen, zu verstehen, welche Komponente Speicher benötigtBearbeiten: Gemäß der Ausgabe des dbcc-Memorystatus kann ich 2 NUMA-Knoten sehen, und der von jedem Knoten verwendete Speicher beträgt ca.
Wieder, wenn Sie Memory Manager in memorystatus sehen, geben Sie seine
VM festgeschrieben ist tatsächlich ein von SQL Server festgeschriebener virtueller Speicher, und da dieser Speicher festgeschrieben ist, hat er
physical memory backing it
. Dies wiederum lässt mich denken, dass SQL Server 65 G verwendet, wie im maximalen Serverspeicher festgelegtDies ist der maximale Serverspeicher. Damit der Speicher gut auf beide Knoten verteilt ist, können Sie auch die Ausgabe der folgenden Abfrage hinzufügen, um dies zu überprüfen. Bitte Screenshot hinzufügen
quelle
select * from sys.dm_so_process_memory