SQL Server 2012-Speicherverbrauch außerhalb des Pufferpools

9

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: -

Ausgabe von DBCC MEMORYSTATUS

Und hier ist das festgelegte Speicherlimit: -

Screenshot des Speicherlimits

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: -

MemoryClerkOutput

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

Screenshot von PhysMemInUse

Dies scheint also darauf hinzudeuten, dass SQL Server mehr als 65 GB verwendet.

dbafromthecold
quelle
Was bringt das? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand
Hallo Aaron, danke für die Antwort. Ich werde die Frage jetzt mit der Ausgabe aktualisieren
dbafromthecold

Antworten:

11

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:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • Top 20 Angestellten

    Sie haben dies bereits getan, aber der Vollständigkeit halber:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • 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):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    Sie können aber auch sehen, wie viel Speicher von Thread-Stacks belegt wird, indem Sie Folgendes verwenden:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • Module von Drittanbietern geladen

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • speicherbezogene DMVs

    Möglicherweise können Sie bei diesen DMVs auch etwas Außergewöhnliches erkennen:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

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):

Aaron Bertrand
quelle
Danke Aaron, der Server hat viel Speicher zur Verfügung. Ich wollte nur sehen, ob ich herausfinden kann, was diese 20 GB verwendet. Gibt es eine Möglichkeit, den Speicherverbrauch von direkten Windows-Zuordnungen oder Thread-Stacks zu ermitteln?
dbafromthecold
Ich habe die Skripte ausgeführt und der Zähler für den gestohlenen Serverspeicher (KB) liegt bei 14 GB. Ich werde graben, um zu sehen, ob ich weitere Informationen bekommen kann
dbafromthecold
Gestohlener Serverspeicher scheint nicht das Problem zu sein. Immer noch auf der Suche
dbafromthecold
Obwohl dies hier nicht das Problem ist, sollte erwähnt werden, dass sich der Columnstore-Objektpool (CACHESTORE_COLUMNSTOREOBJECTPOOL-Speicher-Clerk-Typ) auch außerhalb des Pufferpools befindet. Siehe diesen Blog-Beitrag von Niko Neugebauer
Blaž Dakskobler
@ BlažDakskobler ja, danke, auch in Erinnerung. Ich werde den Beitrag aktualisieren, wenn ich eine Chance habe
Aaron Bertrand
3

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 maximale Serverspeicher steuert die SQL Server-Speicherzuordnung, einschließlich des Pufferpools, des Kompilierungsspeichers, aller Caches, der qe-Speicherzuweisungen, des Sperrmanager-Speichers und des CLR-Speichers (im Grunde jeder „Angestellte“, wie er in dm_os_memory_clerks zu finden ist). Der Speicher für Thread-Stapel, Speicherhaufen, andere Verbindungsserveranbieter als SQL Server oder Speicher, der von einer Nicht-SQL Server-DLL zugewiesen wird, wird nicht vom maximalen Serverspeicher gesteuert.

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?

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

Können Sie auch die vollständige DBCC MMEMORYSTATUSAusgabe an einem freigegebenen Ort hochladen und den Link hier posten? Dies würde helfen, zu verstehen, welche Komponente Speicher benötigt

Bearbeiten: Gemäß der Ausgabe des dbcc-Memorystatus kann ich 2 NUMA-Knoten sehen, und der von jedem Knoten verwendete Speicher beträgt ca.

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Wieder, wenn Sie Memory Manager in memorystatus sehen, geben Sie seine

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

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 festgelegt

Dies 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

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Shanky
quelle
@DBAFromTheCold: Es ist spät, aber suchen Sie noch nach einer Antwort, wenn ja, ich möchte noch einen Versuch geben :) Können Sie die vollständige Ausgabe vonselect * from sys.dm_so_process_memory
Shanky
Hallo Shanky, danke für die Antwort, aber das Problem hat sich von selbst gelöst. Nichts von meiner Seite, SQL hat den Speicher selbst freigegeben. Ich überwache den Server und wenn es erneut auftritt, werde ich ein Update veröffentlichen. Ich möchte dem wirklich auf den Grund gehen.
dbafromthecold