SQL Server 2005: Es ist nicht genügend Systemspeicher vorhanden, um diese Abfrage auszuführen

13

Einer unserer SQL Server, der seit geraumer Zeit (Jahren) stabil läuft, hat kürzlich unzureichende Speicherfehler ausgegeben. Im Anwendungsereignisprotokoll sehen wir:

Ereignisid: 701

Beschreibung: Es ist nicht genügend Systemspeicher vorhanden, um diese Abfrage auszuführen.

Unser Team, das diesen Server verwaltet, besteht hauptsächlich aus Entwicklern, die ihre Systemadministrationsaufgaben verdoppeln. Unsere Hauptkompetenz ist jedoch die Entwicklung. Abgesehen davon sind wir ratlos darüber, wie wir dieses Problem beheben. Wir haben Foren und so weiter durchsucht und nichts Passendes gefunden

Im Folgenden finden Sie weitere Informationen zur Fehlerbehebung:

  • Unser minimaler Serverspeicher ist auf 0 gesetzt.
  • Unser maximaler Serverspeicher ist auf 2000 eingestellt.
  • Der physische Gesamtspeicher beträgt 3.325,85 MB (von sysinfo).
  • Der virtuelle Gesamtspeicher beträgt 7,10 GB (von sysinfo).
  • Wir haben AWE nicht verwendet, um Speicher zuzuweisen, aber wir müssen jetzt herausfinden, ob es einen Unterschied macht.
  • Dieser Fehler wurde von einem Job ausgelöst, der ein Transaktionsprotokoll sicherte und keine Abfrage ausführte.
  • Wir haben viele Verbindungsserver. Die RDBMS-Typen auf der anderen Seite sind SQL Server (2005 und 2000), Oracle 10g und OSI PI-Systeme.
  • Es ist zu diesem Zeitpunkt intermittierend. Wir können keine Zeit oder Ereignisse mit den Fehlern in Verbindung bringen.
  • Natürlich scheint ein Neustart für eine Weile nicht mehr möglich zu sein, was aufgrund der Art der Fehlermeldung sinnvoll ist.
  • Dieser Server verdreifacht sich als Anwendungsserver (einige Windows-Dienste) und als Webserver sowie als Datenbankserver.

BEARBEITEN:

Wir sind auf SP3. Die meisten Posts, die wir gefunden haben, waren vor SP1, was für uns nicht zutrifft.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

kehrt zurück

9.00.4035.00 SP3 Standard Edition

Aaron Daniels
quelle
Können Sie das SQL Server-Fehlerprotokoll überprüfen, da möglicherweise weitere Details zu diesem Fehler vorliegen.
John Sansom

Antworten:

4

Ich würde auch vorschlagen, den Startparameter -g zu verwenden. Es scheint für die meisten Menschen zu funktionieren und wird wahrscheinlich auch für Sie funktionieren. Meine einzige Sorge wäre, dass das zugrunde liegende Problem möglicherweise nicht gelöst werden kann. Wenn beispielsweise aufgrund eines Verbindungsservers ein Speicherverlust auftritt und die MTL auf 512 MB erhöht wird, dauert es dann zwischen den Speicherproblemen nur länger? Ich kenne die Antwort darauf nicht, aber ich stimme UndertheFold eher darin zu, dass ein Perfmon ein guter Anfang sein kann.

Mike Thien
quelle
7

Die Fehlermeldung "Es ist nicht genügend Systemspeicher vorhanden, um diese Abfrage auszuführen." bezieht sich darauf, dass der virtuelle Adressraum (Virtual Address Space, VAS) nicht verfügbar ist und nicht Speicher im herkömmlichen Sinne, dh im SQL Server-Prozessraum.

Da Sie auf diesem Server nur mit 3 GB arbeiten und SQL Server bis zu 2 GB zugewiesen wurde, bedeutet dies, dass das Betriebssystem und vor allem alle anderen Komponenten auf der Box weniger als 1 GB zum Spielen haben. Das ist nicht viel Gedächtnis.

Wenn dieses Problem tatsächlich auf einen Speicherverlust zurückzuführen ist, wird der VAS außerhalb des SQL Server-Prozessbereichs (memToLeave) verwendet.

Ich würde vorschlagen, den Startparameter -g zu verwenden, um dem memToLeave-Teil mehr Speicher zuzuweisen.

Weitere Informationen finden Sie im folgenden Artikel:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Möglicherweise möchten Sie auch die maximale Speichereinstellung von SQL Server reduzieren, aber ich würde dies als letzten Ausweg tun.

John Sansom
quelle
Guter Artikel. Danke, dass du es auch geschrieben hast! In unseren SQL-Protokollen werden mehrere AppDomains entladen. Wir haben nur 2 gespeicherte CLR-Prozeduren, die im Grunde nur Daten von einem Webdienst abrufen und dort ablegen. Es scheint seltsam, dass diese 2 gespeicherten CLR-Prozeduren zu viel VAS verwenden würden.
Aaron Daniels
Bitte. Wie Sie vielleicht wissen, beträgt die Standardzuweisung für memToLeave nur 256 MB. Dies ist eine recht kleine Sandbox für Ihre AppDomains, sämtlichen CLR / verwalteten Code, Linked Server-Abfragen, SSIS usw., insbesondere wenn Sie den gesamten verfügbaren Speicher auf dem Server nutzen. Ich würde vorschlagen, es mit dem Startparameter -g auf 512 MB zu verdoppeln.
John Sansom
1

Dies könnte mit einem Speicherverlust eines Verbindungsservertreibers zusammenhängen. Diesem Forenthread zufolge :

Microsoft hat uns Folgendes mitgeteilt.

Die Verarbeitung von Daten mithilfe eines Verbindungsservers speziell für den Fox Pro-Treiber führt anscheinend zu Speicherverlusten, die sich im Laufe der Zeit ansammeln.

splattne
quelle
0

Dieser Server verdreifacht sich als Anwendungsserver (einige Windows-Dienste) und als Webserver sowie als Datenbankserver.

Ich würde Ihre minimale Speicherkapazität festlegen - es ist durchaus möglich, dass diese anderen Prozesse SQL-Speicher "stehlen"

Sie können ein Zählerprotokoll mit perfmon ausführen, um dies zu bestätigen, und / oder sich selbst weitere Informationen geben, um das tatsächliche Problem zu identifizieren.

CPU_BUSY
quelle
0

Referenz aus diesem Blog!

Es gibt verschiedene Alternativen, um dieses Problem zu lösen.

Zuerst überprüfen Sie Ihre SQL - Server - Einstellung für „min server memory“ und „max server memory“. Wenn Sie bei beiden Werten einen sehr geringen Unterschied festgestellt haben, erhöhen Sie den „maximalen Serverspeicher“.

Zweitens: Sie haben lange laufende Abfragen mit Informationen zur Speichernutzung gefunden. Wenn sich diese Abfrage im Leerlauf befindet, überprüfen Sie diesen Vorgang und beenden Sie ihn. Die Optimierung der Datenbankleistung spielt eine wichtige Rolle bei der Speichernutzung.

Drittens haben Sie herausgefunden, welche Indexverwendungen für Abfragen mit langer Laufzeit verwendet werden, da die Anzahl der Festplatten-E / A ansteigt und sich dies direkt auf Ihren Arbeitsspeicher auswirkt, wenn Sie das System nicht ordnungsgemäß indizieren.

Viertens: Überprüfen Sie die Größe der Auslagerungsdatei für den virtuellen Speicher und erhöhen Sie die Größe dieser Datei.

Fünftens: Überprüfen Sie die Größe des "Mindestspeichers pro Abfrage", der standardmäßig 1024 KB beträgt. In seltenen Fällen können Sie die Größe dieses Parameters verringern. Eigentlich ist das nicht ratsam, aber Sie können es versuchen.

Sechstens: Versuchen Sie, diesen DBCC-Befehl auszuführen. Dies ist jedoch nicht ratsam, da dies die Gesamtleistung des Servers beeinträchtigen kann. Aber du kannst es versuchen.

Anvesh
quelle