Der gestohlene Serverspeicher der DB Engine ist zu hoch

8

Ich erhalte eine Fehlermeldung vom System Center Operations Manager (SCOM).

Wie löse ich diesen Fehler?

Der gestohlene Serverspeicher der SQL DB 2012-Engine ist zu hoch.

Ich führe eine Abfrage aus und erhalte folgende Zähler:

╔═══════════════════════════════╦═════════════╗
║ Stolen Server Memory (MB)     ║ 7354.773437 ║
║ Lock Memory (MB)              ║ 106.195312  ║
║ Free Memory (MB)              ║ 64.632812   ║
║ Connection Memory (MB)        ║ 24.203125   ║
║ Log Pool Memory (MB)          ║ 14.085937   ║
║ Optimizer Memory (MB)         ║ 2.351562    ║
║ Granted Workspace Memory (MB) ║ 1.296875    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
╚═══════════════════════════════╩═════════════╝
Darko Milic
quelle

Antworten:

10

Wie oft sehen Sie solche Nachrichten? Wenn es ein- oder zweimal ist, kann es ignoriert werden.

"Gestohlener Speicher", wie in diesem älteren Support-Artikel beschrieben, und Verwendung des DBCC MEMORYSTATUS ist:

Gestohlener Speicher beschreibt Puffer, die zum Sortieren oder für Hashing-Vorgänge (Abfrage-Arbeitsbereichsspeicher) verwendet werden, oder für Puffer, die als generischer Speicher für Zuordnungen zum Speichern interner Datenstrukturen wie Sperren, Transaktionskontext und Verbindungsinformationen verwendet werden . Der Lazywriter-Prozess darf gestohlene Puffer nicht aus dem Pufferpool spülen.

Der Speicher wird normalerweise aus dem Pufferpool entnommen. Wenn Sie ausgeführt werden DBCC MEMORYSTATUSund die Ausgabe Ihnen hohe gestohlene Seiten anzeigt , bedeutet dies, dass ein Prozess mehr Speicher aus dem Pufferpool stiehlt als erforderlich, und Sie müssen diesen Prozess finden.

Es ist sehr wahrscheinlich, dass eine Operation ausgeführt wurde, die eine große Sortieroperation ausführte, und gleichzeitig SQL Server stark Speicher verbrauchte, was zu dieser Meldung führte. Sofern Sie nicht mit einem OOM-Problem konfrontiert sind, wird diese Meldung eher als Warnung betrachtet .

Shanky
quelle
-1

Ich habe dies in der Google-Suche gesehen, da wir vor einem ähnlichen Problem stehen (gestohlener Speicher macht ~ 50% des gesamten Speichers aus), können dies jedoch nicht

Übrigens habe ich unten Code gefunden

select type, name, sum((pages_kb*1024)/8192) as stolen_pages
from sys.dm_os_memory_clerks
where pages_kb > 0
group by type, name
order by stolen_pages desc;

type    name    stolen_pages
MEMORYCLERK_SQLBUFFERPOOL   Default 1710360

Ich habe es weiter modifiziert, um% von Stolen als Gesamtspeicher anzuzeigen

SELECT Now = GETDATE()
    ,StolenMemory = (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        )
    ,StolenMemoryPercent = 100.0 * (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        ) / (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Total Server Memory (KB)')
        )
Jerry Hung
quelle