SQL Server 2008 R2 "Ghost Memory"?


12

Wir haben einen dedizierten SQL Server 2008 R2-Computer, auf dem einige seltsame Speicherprobleme auftreten. Der Computer selbst verfügt über zahlreiche Ressourcen, darunter zwei Quad-Core-Prozessoren, 16 GB RAM und 64-Bit-Windows Server 2008 R2 Enterprise (Dell PowerEdge 2950). .

Das seltsame Problem besteht darin, dass das System 82% des verwendeten Speichers meldet, sqlservr.exe jedoch nur 155 MB belegt. Ich vermute, dass SQL Server das Problem ist, weil der Speicherverbrauch nach einem Neustart des Prozesses sqlservr.exe für einen bestimmten Zeitraum wieder normal ist.

Hat jemand eine Idee, wie ich dieses Problem aufspüren kann?

Danke, Jason


3
Verwenden Sie das Benutzerrecht "Seiten im Speicher sperren"? In diesem Fall wird der gesperrte Speicher vom Task-Manager nicht gemeldet. Weitere Informationen finden Sie unter blogs.technet.com/b/askperf/archive/2008/03/25/… .
Mark S. Rasmussen

Wir haben das Benutzerrecht "Seiten im Speicher sperren" auf "Keine" gesetzt. Wir haben auch die Einstellung "Maximaler Serverspeicher (in MB)" in der Standardeinstellung int.MaxValue - glauben Sie, dass dies ein Problem verursachen könnte?
Typefragger

4
Das einzige Mal, dass ich besorgt sein würde, ist, wenn mein SQL-Server weniger als 82% verwendet!
SqlACID

Antworten:


15

Sie erhalten vom Task-Manager kein genaues Bild der Speichernutzung, wenn das Konto, unter dem der Dienst ausgeführt wird, über die Sperrseiten mit Speicherberechtigung verfügt (Bearbeitung: gemäß Mark Rasmussens Kommentar / Link). Um festzustellen, wie viel Speicher verwendet wird, können Sie Folgendes überprüfen:

  • SQLServer: Leistungsindikator für Speichermanager \ Gesamtserverspeicher
  • DMVs

Ich kann mich nicht erinnern, ob es eine DMV oder eine Kombination davon gibt, die Ihnen die Gesamtspeicherzuordnung gibt, aber das Folgende zeigt den Großteil davon.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Die zweite Option ist in der Regel die interessanteste, nämlich die Pufferpoolzuweisung nach Datenbank. Hier wird der Löwenanteil verwendet, und es kann hilfreich sein, zu verstehen, welche Ihrer Datenbanken die größten Konsumenten sind.


Wow vielen Dank! Dies (insbesondere das zweite) machte es mir völlig klar!
Typefragger

8

In einem kürzlich erschienenen Artikel von Brent Ozar wird dieser Fall behandelt, wenn der Task-Manager den von SQLServer und seinen zusätzlichen Diensten belegten Speicher nicht korrekt anzeigt. Sie finden es hier: Ein Sysadmin-Handbuch zum Microsoft SQL Server-Speicher .

Zitat: " Warum verwendet SQLServer.exe nicht viel Speicher?

Wenn Sie von einem Remotedesktop auf einen Server zugreifen und sich den Task-Manager ansehen, wirkt die Mem-Verwendung von sqlservr.exe immer verrückt. Das ist nicht die Schuld von SQL Server. Der Task-Manager ist ein schmutziger, schmutziger Lügner. (Ich weiß, es hört sich so an, als würde der SQL-Typ die Schuld auf sich ziehen, aber nehmen Sie es für eine Sekunde mit.) Bei 64-Bit-Boxen ist diese Zahl etwas genauer, aber bei 32-Bit-Boxen ist sie einfach völlig falsch . Um wirklich ein genaues Bild davon zu erhalten, wie viel Speicher SQL Server verwendet, benötigen Sie ein Tool wie Process Explorer und müssen alle SQL Server-Prozesse identifizieren. Auf dem Server, den ich rechts zeige, befinden sich zwei SQL Server-Instanzen (von sqlservr.exe angezeigt) sowie die Sicherungstools SQL Agent, SQL Browser und SQL Server. Es ist nicht ungewöhnlich, dass SQL Server Analysis Services, Integration Services und Reporting Services auch auf demselben Server ausgeführt werden - alle davon belegen Speicher.

Wie viel Speicher verbraucht SQL? Ich werde es dir leicht machen. SQL Server verwendet den gesamten Speicher. Zeitraum."

Daher rate ich Ihnen, Marks Abfrage zu testen und ein besseres Tool für den Speicherbericht zu verwenden. Oder vertrauen Sie einfach Perfmon, um Speicher zu melden, nicht dem Task-Manager.


-2

Die Größe des von SQL verwendeten Speichers, wie im Task-Manager angezeigt, ist hauptsächlich die Einstellung für den maximalen Speicher. So funktioniert die Min / Max-Einstellung:

Wenn der SQL Server gestartet wird, wird der Speicher auf die Mindestspeichereinstellung hochgefahren. Wenn Ihr SQL-Bedarf steigt, verwendet SQL mehr Speicher bis zur Einstellung "Maximaler Speicher". Der Speicher bleibt dann an diesem (maximalen) Punkt, selbst wenn die SQL-Nutzung abnimmt. Dadurch entsteht der Eindruck, dass SQL große Aufgaben ausführt und so viel Speicher verbraucht. In Wirklichkeit ist dieser Speicher von SQL reserviert.

Wenn auf dem Server ein Nicht-SQL-Speicherdruck vorliegt, gibt SQL den Speicher bis zum Einstellungspunkt für den Mindestspeicher frei. So werden die Speichereinstellungen verwendet. Mithilfe von Marks Skripten können Sie sehen, wie SQL diesen Speicher verwendet.


1
Min / Max regelt die Pufferpoolzuweisung, sonst nichts. Dies ist die erste Zeile in der Beschreibung der Serverspeicheroptionen in BOL. Die Einstellungen haben absolut keinen Bezug zu denen, die im Task-Manager angezeigt werden. Brents Beschreibung von taskmgr als "schmutziger, schmutziger Lügner" fasst die Situation so gut zusammen, wie alle, die ich gelesen habe.
Mark Storey-Smith

@ Markstorey-smith bitte lies den inhalt weiter unten im link in deinem eigenen kommentar, es erklärt nur weiter meinen punkt. Der Task-Manager zeigt die Verwendung der Systemressourcen an. Pufferpool ist keine Systemressource. Ich erkläre, was die im Task-Manager angezeigte Speichernutzung durch SQL bedeutet. Sie geben das Offensichtliche an, indem Sie den Pufferpool erwähnen, aber das beweist mich immer noch nicht falsch.
StanleyJohns

Ich weiß nicht, wie ich das besser ausdrücken soll ... "Die von SQL verwendete Speicherkapazität, wie sie im Task-Manager angezeigt wird, ist hauptsächlich die Einstellung für den maximalen Arbeitsspeicher. So funktioniert die Einstellung für den minimalen / maximalen Arbeitsspeicher." nicht.
Mark Storey-Smith

'So funktionieren die Min / Max-Einstellungen:' Am Ende befindet sich ein Doppelpunkt. Dies bedeutet, dass die Erklärung folgt und nicht, dass der vorherige Satz bestätigt wird. :)
StanleyJohns

1
Ich bin bei Mark. Lesen Sie den Blog von Slava Oks : Er war Teil des MS-Teams, das den Speichermanager geschrieben hat. Gehen Sie zur Überschrift "Buffer Pool". Ich zitiere: "Denken Sie daran, SQL Server verfügt über zwei Speichereinstellungen, die Sie mit sp_conifigure steuern können. Es handelt sich um den maximalen und minimalen Serverspeicher. Ich bin nicht sicher, ob Sie dies wissen, aber diese beiden Einstellungen steuern die Größe des Pufferpools wirklich. Sie steuern insgesamt nicht Von SQL Server
belegter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.