Speicher von SQL Server zurückfordern

10

Ich habe eine SQL Server-Instanz, deren Speichernutzung allmählich zunimmt, bis Windows sie nicht mehr bereitstellt. Es scheint logisch, dass das gelegentliche große Abfrageergebnis dazu führen würde, dass die Instanz wächst.

Gibt es eine Möglichkeit, SQL Server davon zu überzeugen, den nicht mehr benötigten Speicher freizugeben (außer den Dienst neu zu starten)?

Bearbeiten:
Ich verwende SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)

Das konnte ich anhand der folgenden Abfrage herausfinden:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
BIBD
quelle

Antworten:

19

Das ist genau , wie SQL Server soll an die Arbeit.

Wenn Sie andere Dienste auf diesem Computer haben und nicht möchten, dass SQL den gesamten verfügbaren Speicher belegt, müssen Sie den maximalen Serverspeicher festlegen. Siehe SQL Server-Speicheroptionen auf MSDN.

Portman
quelle
1
Klingt eher nach einem Fehler als nach einer Funktion ... das passiert mir auch. SQL Server belegt 95% des verfügbaren Arbeitsspeichers, um etwas zu tun, und kann es nicht freigeben, wenn es abgeschlossen ist.
Alchemical
1
@Alchemical Hängt davon ab, was Sie unter " vollständig " verstehen . SQL Server kann den gesamten Arbeitsspeicher eines Computers nutzen. Verwenden Sie es als Festplatten-Cache. Es ist nicht „ vollständig “ es als Disk - Cache , bis Sie SQL Server nicht mehr verwenden.
Ian Boyd
8

Die anderen Poster stimmen, dass dies beabsichtigt ist, aber Sie möchten den maximalen Speicher unbedingt auf etwas weniger als den RAM Ihres Servers beschränken. Denken Sie an diese Abfolge von Ereignissen:

  • SQL 2000 läuft problemlos und beansprucht den gesamten RAM Ihres Servers
  • Jemand RDPs in, oder Sie müssen den IE aufrufen, um einen Patch herunterzuladen, oder Ihre Backups starten, was auch immer
  • SQL muss genügend Speicher freigeben und freigeben, damit das Betriebssystem funktioniert
  • Die Leistung ist schlecht, während Speicher freigegeben und auf die Festplatte übertragen wird
  • Sobald es stabil ist, läuft es gut genug
  • Der andere Vorgang wird abgeschlossen und SQL stellt den freigegebenen RAM schrittweise wieder her
  • Wiederholen

Um dies zu vermeiden, konfigurieren Sie Ihr maximales Server-Speicherlimit auf etwa 80-90% Ihres tatsächlichen physischen Speichers. Anweisungen für SQL 2000 unter: http://msdn.microsoft.com/en-us/library/ms178067.aspx

sh-beta
quelle
Denken Sie daran, dass dieses Verhalten 2005 ist und 2008 - 2000 keinen Speicher bei Bedarf für das Betriebssystem freigibt.
Paul Randal
2
Nicht genau auf Anfrage, aber es gibt Speicher an das Betriebssystem zurück. Über den Link, den ich gepostet habe: "Wenn SQL Server Speicher dynamisch verwendet, fragt es das System regelmäßig ab, um die Menge des freien physischen Speichers zu ermitteln. Unter Microsoft Windows 2000 vergrößert oder verkleinert SQL Server den Puffercache, um den freien physischen Speicher zwischen 4 MB zu halten und 10 MB abhängig von der Serveraktivität. Durch die Beibehaltung dieses freien Speichers wird verhindert, dass Windows 2000 ausgelagert wird. Wenn weniger Speicher frei ist, gibt SQL Server Speicher an Windows 2000 frei. Wenn mehr Speicher frei ist, weist SQL Server dem Pufferpool Speicher zu. "
Sh-Beta
Ah - stimmt - es macht den Trick, ein bisschen physisches Gedächtnis freizugeben - Sie haben Recht!
Paul Randal
4

Es wird nur freigegeben, wenn das Betriebssystem signalisiert, dass der Arbeitsspeicher knapp ist, oder wenn Sie den Dienst beenden und neu starten. Sie müssen lediglich die maximale Menge begrenzen, die SQL verwendet, indem Sie den Wert für den maximalen Serverspeicher konfigurieren. Wenn es auf dem Server nichts anderes gibt, das RAM benötigt (und hoffentlich auch nicht), würde ich mir darüber keine Sorgen machen.

SqlACID
quelle
4

Um die Antworten zusammenzufassen:

Es gibt keine Möglichkeit, MS SQL Server aufzufordern, nicht sofort benötigten Speicher freizugeben. SQL Server sollte bei Bedarf automatisch Speicher freigeben, jedoch nicht vorher. Und wenn Sie Speicherprobleme haben, sollten Sie den Wert der Speicheroption "Maximaler Serverspeicher" reduzieren.

BIBD
quelle
3

SQL Server verbraucht Speicher und gibt ihn nicht zurück, es sei denn, das Betriebssystem teilt ihm mit, dass Speicherdruck besteht. Wie Portman angegeben hat, ist dies beabsichtigt. Wenn Sie den Speicherverbrauch begrenzen möchten, müssen Sie den maximalen Serverspeicher festlegen, den SQL Server verwendet.

K. Brian Kelley
quelle
2

Denken Sie daran, dass das Verhalten, das Sie alle beschreiben, ab SQL Server 2005 erfolgt, als der Speichermanager neu geschrieben wurde, um (unter anderem) auf Speicherdruckanforderungen vom Betriebssystem zu reagieren.

Bei SQL Server 2000 und früheren Versionen wird der Speicher nach dem Zugriff nicht zurückgegeben, unabhängig davon, wie viel das Betriebssystem dafür benötigt.

CodeSlave - laufen Sie auf 2000, 2005 oder 2008?

Paul Randal
quelle
Ah ha ... ja in der Tat SQL 2000.
BIBD
3
Es gibt es nicht zurück, wenn das Betriebssystem danach ruft, aber es gibt es zurück, wenn es sieht, dass das Betriebssystem unter einem bestimmten Schwellenwert für freien physischen Speicher liegt. Siehe msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta
Und um das zu bekräftigen, was sh-beta gesagt hat, gibt SQL Server 2000 nur dann Speicher frei, wenn es feststellt, dass das Betriebssystem über wenig physischen Speicher verfügt, da Windows erst unter Windows XP (2001) eine API hinzugefügt hat, mit der das Betriebssystem "schreien" kann it "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005 nutzt diese neue Funktion von Windows. Als SQL Server 2000 geschrieben wurde, gab es für das Betriebssystem keine Möglichkeit, danach zu rufen, sodass SQL Server regelmäßig nach Speicherdruck suchen musste.
Ian Boyd
0

Alte Frage, ich weiß, aber eine Möglichkeit, SQL (zumindest neuer) zum Freigeben von Speicher zu zwingen, besteht darin, eine Anwendung zu schreiben, die so viel Speicher wie möglich in Blöcken zuweist und auf (sagen wir) 15 Sekunden wartet (z. B. Sleep (15000)). und das Freigeben des zugewiesenen Speichers und das Verlassen; Ich habe dies versucht und SQL gibt den Speicher frei, damit das System seinen RAM zurückerhält. Das Schreiben von Code wie dem oben genannten ist mit C / C ++ fast trivial. Es geht lediglich darum, eine Kette von Strukturen einzurichten, die die Speicherblockkette (Zeiger und Größe) halten. Reduzieren Sie die Größe schrittweise, wenn ein "malloc ()" ausfällt, bis es erreicht ist ein Minimum (sagen wir weniger als 1024) und durchlaufen dann die verknüpfte Liste, um die zugewiesenen Blöcke freizugeben

Ein Passant
quelle