Was passiert, wenn für SQL Server kein physischer Speicher mehr verfügbar ist?

16

Beim googeln habe ich widersprüchliche Informationen gefunden.

Einige Sites geben an, dass SQL Server die bereits vorhandenen Daten in TEMPDB verschiebt, wenn kein physischer Speicher mehr für Daten vorhanden ist (siehe: SQL Server: TempDb entmystifizieren und Empfehlungen ).

Andere Sites geben jedoch an, dass das Betriebssystem die SEITENDATEI verwenden und Daten aus dem physischen Speicher dorthin verschieben kann, wenn nicht genügend physischer Speicher verfügbar ist (siehe Auslagerungsdatei für SQL Server ).

Ich frage mich, wo SQL Server Daten schreibt, wenn der physische Speicher voll ist. Zu tempdb oder zur OS-Auslagerungsdatei? Oder vielleicht beide?

RaufDBA
quelle

Antworten:

28

Wenn kein physischer Speicher mehr für Daten vorhanden ist, verschiebt SQL Server die bereits vorhandenen Daten in TEMPDB

Der Artikel, mit dem Sie verlinkt haben, ist bestenfalls irreführend und an einigen Stellen falsch. Ich denke, der Autor hat versucht, einige komplizierte Dinge zu stark zu vereinfachen, und ist dabei ein wenig zu weit gegangen.

SQL Server verschiebt auf diese Weise keine Daten aus dem Speicher (dem Pufferpool) in tempdb. Es wird (im Allgemeinen) eine "zuletzt verwendete" Cachestrategie verwendet. Wenn also Speicherdruck besteht und neue Daten in den Speicher gezogen werden müssen, werden die LRU-Daten von SQL Server aus dem Pufferpool entfernt, um die neuen Daten aufzunehmen. Dieses Verhalten wird häufig von einem Leistungsindikator namens "Page Life Expectancy" (PLE) überwacht :

Die Definition von PLE ist die erwartete Zeit in Sekunden, die eine Datendateiseite, die in den Pufferpool (den speicherinternen Cache von Datendateiseiten) eingelesen wird, im Speicher verbleibt, bevor sie aus dem Speicher verschoben wird, um Platz für andere Daten zu schaffen Dateiseite. Eine andere Möglichkeit, sich PLE vorzustellen, ist eine augenblickliche Messung des Drucks auf den Pufferpool, um Speicherplatz für Seiten freizugeben, die von der Festplatte gelesen werden. Für beide Definitionen ist eine höhere Zahl besser.

Während der Ausführung der Abfrage, SQL Server kann tempdb für bestimmte Operationen verwenden. Dies geschieht normalerweise, wenn die Schätzungen schlecht sind, aber wenn nur wenig Speicher verfügbar ist, kann dies das Verhalten beeinflussen.

Einige der Vorgänge, die auf diese Weise auf Tempdb "übergreifen" können, sind das Hashing von Zeilen (für Joins oder Aggregate usw.), das Sortieren von Zeilen im Speicher und das Puffern von Zeilen während der parallelen Abfrageausführung.

Benutzerabfragen können auch explizit Tempdb (mit globalen oder lokalen temporären Tabellen) und implizit Tempdb (mit Snapshot- oder Read-Committed-Snapshot-Isolationsstufen) verwenden.

Keine dieser Situationen scheint wirklich zu der Aussage zu passen, die Sie zitiert haben.

Wenn nicht mehr genügend physischer Speicher verfügbar ist, kann das Betriebssystem die SEITENDATEI verwenden und Daten aus dem physischen Speicher dorthin verschieben

Dies kann definitiv passieren und liegt größtenteils außerhalb der Kontrolle von SQL Server. Es gibt einen Knopf, mit dem Sie versuchen können, bestimmte Arten von Paging auf Betriebssystemebene zu verhindern, nämlich das Aktivieren von "Lock Pages in Memory" (LPIM) :

Diese Windows-Richtlinie bestimmt, welche Konten einen Prozess verwenden können, um Daten im physischen Speicher zu speichern, und verhindert, dass das System die Daten in den virtuellen Speicher auf der Festplatte paginiert.

Also, was können wir verhindern, dass auf die Festplatte ausgelagert wird?

Vor SQL Server 2012 wurden Seiten, die über eine Komponente namens "Single Page Allocator" zugewiesen wurden, im Speicher gesperrt (konnte nicht ausgelagert werden). Dies umfasste den Pufferpool (Datenbankseiten), den Prozedurcache und einige andere Speicherbereiche.

Weitere Informationen finden Sie unter Spaß mit gesperrten Seiten, AWE, Task-Manager und dem Arbeitssatz ... , insbesondere im Abschnitt "4. Jetzt weiß ich, dass SQL Server unter x64" Gesperrte Seiten "verwenden kann. Was genau ist gesperrt?" Weitere verwandte Literatur finden Sie hier: Große SQL Server-Debatten: Seiten im Speicher sperren

In SQL Server 2012 und höher gibt es keinen "Einzelseitenzuweiser" (die Einzel- und Mehrseitenzuweisungen wurden gemäß einem ausführlichen Blick auf den Arbeitsspeicher (SQL Server 2012/2014 ) zusammengeführt). Die Details dessen, was genau ausgelagert werden kann und was nicht, sind nirgendwo detailliert dokumentiert, wo ich sie gesehen habe. Sie können eine Abfrage verwenden , wie dies zu sehen , was ist gesperrt:

select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

In demselben MS Support-Artikel können Sie auch nachlesen DBCC MEMORYSTATUS, wie viel Speicher "gesperrt" ist.

Als Randnotiz können Sie im Fehlerprotokoll Hinweise darauf finden, dass der Arbeitssatz von SQL Server vom Betriebssystem ausgelagert wird. Es wird Nachrichten geben, die so aussehen:

2019-09-02 10: 19: 27.29 spid11s Ein erheblicher Teil des SQL Server-Prozessspeichers wurde ausgelagert. Dies kann zu Leistungseinbußen führen. Dauer: 329 Sekunden Arbeitssatz (KB): 68780, Festgeschrieben (KB): 244052, Speichernutzung: 28%.

Josh Darnell
quelle
0

Moderne Versionen von SQL Server haben eine sehr geringe Wahrscheinlichkeit, dass sie sich aufhängen. SQL Server lädt .NET Framework in seinen Adressraum und verwendet es im normalen Betrieb. Wenn sowohl der physische Speicher als auch die Auslagerungsdatei zur Neige gehen, versucht Windows, die Auslagerungsdatei zu vergrößern. Selbst wenn die Auslagerungsdatei vergrößert werden kann, ist dies kein sofortiger Vorgang, und die Speicherzuordnung schlägt fehl, während die Auslagerungsdatei vergrößert wird. Es gibt einen Fehler im .NET Asynchronous I / O-Handler, bei dem Speicher als Reaktion auf eine APC-Benachrichtigung zugewiesen wird. Wenn der Anruf newfehlschlägt, wird es werfenOutOfMemoryException. Diese Ausnahme wird im systemeigenen Code des Taskplaners abgefangen. Die asynchrone E / A scheint jedoch niemals zu enden. Der Finalizer-Thread für FileStream blockiert das Warten auf den Abschluss der E / A, sodass der Puffer freigegeben und der Finalizer-Thread für immer aufgehängt werden kann. Dies führt dazu, dass .NET Framework nach und nach immer mehr Speicher belegt, bis kein Speicher mehr zugewiesen werden kann. In diesem Fall reagiert SQL Server nicht mehr, da Winsock keine Puffer mehr zuweisen kann, sodass selbst die Administratorzugriffsverbindung unbrauchbar ist.

Ich habe tatsächlich einen Taskplaner Total Hangup in einer .NET-Anwendung aufgrund von Speichermangel getroffen. Zum Glück ist der Prozess schließlich aufgrund OutOfMemoryExceptioneines Threads zum Erliegen gekommen, der ihn nach mehreren Fehlern nicht abfing, sodass wir herausfinden konnten, was den Server tatsächlich aufgehängt hat.

Sobald ich wusste, wonach ich suchte, war es einfach, den Fehler in der statischen Analyse zu finden.

Joshua
quelle