Wie bringe ich SQL Server dazu, seinen Speicher freizugeben?

19

Ich weiß, dass SQL RAM mag, es aber freigibt, wenn Windows danach fragt. Ich weiß, dass SQL so funktionieren soll. Ich habe jedoch einen Windows-Administrator, der nicht überzeugt ist, dass SQL tatsächlich den Arbeitsspeicher zurückgibt, und auf diesem bestimmten (virtuellen) Server benötigt SQL nach Abschluss von Analysis Services nicht viel, aber auf diesem Server gibt es nichts, was die Mühe macht Fragen Sie SQL nach viel.

Daher versuche ich, den Windows-Administratoren zu versichern, dass Probleme mit der virtuellen Umgebung nicht "weil SQL zu viel RAM verwendet" sind, aber ich kann SQL nicht davon überzeugen, es freizugeben, ohne den Dienst neu zu starten.

Bei der Verarbeitung von Cubes beansprucht der SQL-Dienst gerne 8 GB RAM. Da jedoch kein Druck auf ihn ausgeübt wird, wird an einem normalen Tag nicht viel davon freigegeben. Die Windows-Leute schreien, und es wäre viel schöner, wenn SQL dies veröffentlicht.

Ich möchte nicht die maximale Speichereinstellung verwenden, da SQL bei der Verarbeitung tatsächlich so viel RAM verwenden soll. Ich möchte nur, dass es danach wieder runter geht.

Es ist möglicherweise ein Duplikat sowohl SQL Server nicht Speicher Freigabe und von SQL Server Reclaiming Speicher , aber ich frage mich , ob es eine andere Antwort. Das Warten auf Windows, um es zurückzugewinnen, wird die Windows-Leute hier nicht überzeugen. Ein Neustart des Dienstes ist eine Option, aber ich bin wirklich kein Fan dieser Idee.

Ich möchte wissen, wie ich Windows dazu bringen kann, danach zu fragen ...

Rob Farley
quelle
2
Was beschwert sich ein Sysadmin über den verwendeten RAM? Ich werde beschissen, wenn RAM NICHT verwendet wird, denn wenn es nicht verwendet wird, wird es nur verschwenden ...
Mark Henderson
Ich verstehe es auch nicht, wenn die Maschine den Speicher nicht benötigt - wo ist das Problem? So funktionieren das Betriebssystem und seine Anwendungen normalerweise ... Wenn die Arbeitslast des inaktiven SQL-Dienstes den größten Teil des Arbeitsspeichers einnimmt, wenn nichts anderes benötigt wird, kann dies die Antwortzeit und / oder die Leistung für den nächsten SQL-Auftrag erhöhen?
Oskar Duveborn
Der Windows-Administrator ist der Ansicht, dass SQL den Computer überlastet, weil der Prozess über so viel RAM verfügt. Ich weiß, dass die Box nicht unter SQL-Stress steht, und kann dies durch einen Neustart des SQL-Dienstes demonstrieren. Dies zeigt, dass sie nur viel RAM verbraucht, wenn die Daten für die SSAS-Verarbeitung abgerufen werden. Daher möchte ich, dass SQL den Speicher freigibt, um die Menge an RAM anzuzeigen, die SQL für den Rest des Tages verwendet. Es geht nicht darum, dass sie mehr RAM bereitstellen, sondern dass sie aufhören, SQL für Dinge verantwortlich zu machen.
Rob Farley
2
Wenn Sie mit Farseeker einverstanden sind, sollte Sysadmin froh sein, dass RAM verwendet wird. Wenn es nicht zurückgefordert wird, benötigt der Server es nicht. Bitten Sie den Systemadministrator möglicherweise, sich die Seitenfehler anzusehen, um anzuzeigen, dass das System nicht überlastet ist.
Nick Kavadias
2
Wenn Ihr Systemadministrator nicht versteht, was Seitenfehler bedeuten und warum es kein Problem ist, Speicher zu belegen, aber keine wirklichen Seitenfehler zu verursachen, kann ich Ihnen nicht helfen. Sie können nicht dumm beheben. Sie können jedoch sp_configure verwenden , um den maximalen Arbeitsspeicher zu deaktivieren , wenn Sie das System nicht verwenden, und ihn zu sichern , wenn Sie ihn benötigen. Dies scheint jedoch ziemlich albern. sp_configureist in der Regel etwas, das Sie einmal einstellen und in Ruhe lassen sollten.
Bacon Bits

Antworten:

12

Ich glaube, Sie haben nur die Möglichkeit, den SQL-Dienst neu zu starten oder eine Anwendung auszuführen, die viel Speicher verbraucht, um die Freigabe von SQL zu erzwingen.

Ich mag den Vorschlag von @Nick Kavadias: Überwachen Sie den Leistungsindikator für Speicher: Seitenfehler / Sek ., Um zu zeigen, dass SQL den Speicher des Betriebssystems nicht unter Druck gesetzt hat.

Mitch Weizen
quelle
2
Danke Mitch ... Lassen Sie mich diese 10 GB Textdatei für Notepad finden.
Rob Farley
lol !, eigentlich ist das keine schlechte idee!
Mitch Wheat
Verwenden Sie möglicherweise eine 2-GB-Datei ...
Mitch Wheat
5

Eine Möglichkeit, ihnen zu zeigen, dass dies der Fall ist, besteht darin, dass SQL Server den gesamten Speicher auffüllt. Kopieren Sie anschließend eine große Datei über das Netzwerk (große SQL-Sicherungsdateien eignen sich hierfür hervorragend). Dadurch füllt sich der Systemcache und Windows fragt SQL nach dem Speicher. SQL beginnt mit der Rückgabe des Speichers an das Betriebssystem, bis die minimale Speichereinstellung erreicht ist.

(Tut mir leid, ich habe nicht die gesamte Frage über Twitter erhalten, es wurden anscheinend mehr als 140 Zeichen benötigt.)

mrdenny
quelle
1
Ich hoffe auf einen Prozess, mit dem ich SQL nach dem Speicher zurückfragen kann (nachdem die Puffer gesäubert und gelöscht wurden), ohne die Box dafür lahm legen zu müssen.
Rob Farley
Ich glaube nicht, dass es eine Möglichkeit gibt, den Windows-Speichermanager zu zwingen, den Speicher zurückzufordern, ohne das Problem auf andere Weise zu erzwingen. Sie könnten wahrscheinlich etwas schreiben, das direkt auf die Win32-API zugreift, aber meines Wissens besteht die einzige Möglichkeit, Windows zum Anfordern von Speicher zurückzufordern, darin, dass es mehr Speicher für einen anderen Prozess benötigt. Wenden Sie sich an Bob oder Paul, sie haben möglicherweise weitere Informationen.
Mrdenny
3
Der Ballon-Treiber von VMware erledigt genau dies - er fordert Windows auf, immer mehr Arbeitsspeicher zur Verfügung zu stellen, damit SQL Server (oder eine andere Anwendung) ihren Arbeitsspeicher aufgibt.
Brent Ozar
Ja - ich hatte gehofft, dass ich so etwas nicht tun müsste.
Rob Farley
@BrentOzar, der Ballon-Treiber von VMware beansprucht nur Speicher aus dem System- Cache , nicht den eigentlichen Prozessspeicher. Es wurde entwickelt, um dem Betriebssystem mitzuteilen, dass "nicht der gesamte verfügbare Speicher für unbedeutende Dinge verwendet wird", und nicht, um ihn herunterzufahren.
Massimo
2

Sie erwähnen "Cubes", daher ist es nicht klar, ob Sie von einer AS-Engine oder einer relationalen Engine sprechen. Die relationale Engine kann bei Bedarf Speicher freigeben:

DBCC FREESYSTEMCACHE('<cache name>');

Wobei "Cache-Name" aus sys.dm_os_memory_clerks übernommen wird . Die Spezifikation von DBCC FREESYSTEMCACHE erwähnt nur Governor-Pools, aber es können tatsächlich viel mehr Caches entfernt werden.

Wenn jedoch der gesamte Speicher vom Pufferpool verwendet wird, führt das Entfernen des gesamten Pufferpools zu einer enormen Leistungsverschlechterung und einer enormen E / A-Last. Lassen Sie SQL dies besser selbst erledigen.

Remus Rusanu
quelle
1
Hallo Remus, der Cache des relationalen Puffers ist nach der Verarbeitung eines Cubes groß. Danach möchte ich wirklich, dass die Caches gesäubert, gelöscht und der Speicher an Windows zurückgegeben wird. DBCC DROPCLEANBUFFERS und FREESYSTEMCACHE leeren den Cache, geben den Speicher jedoch nicht an Windows zurück.
Rob Farley
2
Theoretisch könnten Sie den Speicherdruck vortäuschen (z. B. könnten Sie QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx trampolieren ), aber ich würde wirklich wirklich nicht dorthin gehen. Wenn SQL den festgeschriebenen Speicher nicht freigibt, liegt dies daran, dass das Betriebssystem ihn nicht benötigt. Das Betriebssystem benötigt keinen Speicher, da SQL die einzige Anwendung auf dem Host ist ( stackoverflow.com/questions/1401834/… ), richtig? Wenn Sie eine andere Anwendung mit SQL ausführen, war dies der Fall.
Remus Rusanu
2

Sowohl bei der AS- als auch bei der DS-Engine können Sie eine Obergrenze für den Speicher festlegen, damit dieser unter einem sicheren Schwellenwert bleibt. Dies wird auf 64-Bit-Computern mit viel RAM und / oder mehreren SQL-Instanzen empfohlen. Wenn Sie die Speicherbeschränkung für mindestens das Datenbankmodul auf einen Wert unterhalb der aktuellen Auslastung ändern, wird der Arbeitsspeicher reduziert, ohne dass der Dienst neu gestartet werden muss. Sie sind sich jedoch nicht sicher, ob SSAS verfügbar ist.

Jason Cumberland
quelle
Die Kappe zu haben ist in Ordnung, aber ich denke, ich möchte den maximalen Speicher nach der Verarbeitung nach unten ziehen und dann wieder herausschieben, wenn ich lieber die Puffer säubern, sie fallen lassen und Windows nach Speicherdruck fragen möchte.
Rob Farley
1

Am einfachsten ist es, die Serverspeichereigenschaften aufzurufen, einen kleineren Wert einzugeben, anzuwenden, einige Minuten zu warten und die Konfiguration zu sichern.

Wir haben auch festgestellt, dass die Drosselung des Speichers von SQL-Servern die Leistung des Servers tatsächlich verbessern kann, da Windows dadurch mehr Speicherplatz für das Zwischenspeichern erhält, usw

Nick van Esch
quelle