SQL-Dumping aller Seiten aus dem Puffercache alle paar Minuten

9

Ich habe einen einzelnen SQL2012 SP4-Knoten, auf dem mehrere Datenbanken ausgeführt werden.

Auf dem Server stehen 20 GB Speicher zur Verfügung, 14 GB sind SQL zugewiesen (sonst läuft nichts auf der Box).

Alle paar Minuten speichert SQL den gesamten Puffercache. Die Lebenserwartung der Seite erreicht Null. Die Puffer-Cache-Deskriptoren zeigen, dass sich nichts im Cache befindet.

Ich habe mir die Benachrichtigungen zum Ressourcenmonitor angesehen und die Benachrichtigungen springen alle paar Millisekunden von hoch / stetig / niedrig:

RESOURCE_MEMPHYSICAL_HIGH RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW

Mit Zeitstempeln, die mehrere Millisekunden voneinander entfernt sind. Der PLE ist im Wesentlichen ein Sägezahnmuster.

Ich habe dies schon einmal mit SQL2012 SP1 und dieser Frage gesehen:

Kostenlose SQL Server 2012-Seiten im Puffercache werden nicht verwendet

Scheint ein ähnliches Problem zu sein, obwohl ich bereits auf SP4 aktualisiert habe.

Ich habe versucht, LPIM für das Dienstkonto zu aktivieren, und ich habe versucht, mit der maximalen Speichereinstellung herumzuspielen. Das Verringern des maximalen Speichers scheint dazu geführt zu haben, dass der Puffercache häufiger geleert wird.

Irgendwelche Ideen, was als nächstes zu überprüfen ist?

Die Server-Workload ist buchstäblich nichts (ich scrolle durch die Liste der Elemente in einem ERP-System und sie erreicht ungefähr 40-50 MB, bevor der Cache einfach wieder gelöscht wird).

Es ist interessant, weil ich ein Upgrade von SP1 durchgeführt habe, um dies zu beheben - der Cache dort erreichte ungefähr 500 MB. Seitdem habe ich die maximale Speichereinstellung auf 14 GB gesenkt, was es anscheinend noch schlimmer gemacht hat.

Ich frage mich, ob Windows in Panik gerät und falsche Benachrichtigungen über den Speicherdruck bei SQL auslöst. Daraus folgt, dass der Server mit maximalem Speicher, der auf unbegrenzt eingestellt ist, in Ordnung zu sein schien, aber den Cache nie mehr als ein paar hundert MB füllte - aber jetzt kommt kaum auf 50 ...

Weitere Informationen: für diejenigen, die gefragt haben

Anzahl der Kerne: 4

Datenbankgröße: 80 GB

Das Fehlerprotokoll zeigt: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 247928, committed (KB): 495656, memory utilization: 50%.

Ergebnisse der Ausführung von Skripten über diesen Link: https://www.sqlskills.com/blogs/jonathan/identifying-external-memory-pressure-with-dm_os_ring_buffers-and-ring_buffer_resource_monitor/

Ergebnisse der Speicherdruckabfrage

Ich bin mir nicht sicher, wie ich diese interpretieren soll - es sieht so aus, als ob zu verschiedenen Zeiten sowohl interner als auch externer Speicherdruck herrscht.

Noch mehr Infos:

Dies ist ein Hyper-V-Gast, der auf einem Host mit 96 GB RAM sitzt, von denen etwa die Hälfte den Gästen zugewiesen ist.

Die Symptome scheinen ähnlich zu sein:

SQL Server 2012 x64 - kann nicht sicher mehr als 50% RAM zuweisen

Als ich SQL jedoch 14 GB zuwies, traten die Symptome sofort auf (kaum 3 GB des Serverspeichers wurden festgeschrieben).

Letzte Nacht habe ich den Gastspeicher auf 32 GB erhöht und das Problem ist behoben, aber ich sehe nur 14 GB Festschreibung des gesamten Serverspeichers (und das Unternehmen, in dem die Datenbank ausgeführt wird, ist heute Morgen beschäftigt, und in diesem Fall treten normalerweise Leistungsprobleme auf).

Etwa 8-9 GB Daten im Cache scheinen derzeit stabil zu sein.

Es scheint darauf hinzudeuten, dass 20 GB für die Arbeitslast auf dieser Box ausreichen. Ich bin froh, dass ich es jetzt mit 32 GB belasse, aber ich möchte dem wirklich auf den Grund gehen, damit ich die VMs / SQL besser konfigurieren kann.

Ich werde weiter graben und aktualisieren, wenn ich die Antwort finde!

Noch mehr Infos:

Ich habe SQL nach dem Aktivieren von LPIM nicht neu gestartet (ohne zu wissen, dass dies erforderlich ist), aber ich habe diese Einstellung aktiviert gelassen und neu gestartet, um den Speicher zu aktualisieren. Daher bin ich mir nicht sicher, ob die Erhöhung des Speichers oder LPIM die Probleme behoben hat.

Springt heute Abend ein, wenn der Server inaktiv ist, und überprüft, wie er wieder bei 20 GB aussieht.

Noch mehr Mehr Mehr Info:

Derzeit tickt der Server mit 32 GB zu und wir haben das Problem seitdem nicht mehr gesehen. Wenn dies wieder auftaucht, werde ich auf diese Frage zurückkommen und weiter graben.

Derzeit bleibt ein Rätsel, aber ich vermute, dass ich die Probleme im Moment nur maskiere.

Charleh
quelle
3
Ist das eine virtuelle Maschine? Es klingt so, als würde der Ballon-Treiber von VMware Speicherdruck verursachen.
Max Vernon
1
Wenn es sich um eine VM handelt, die unter VMWare ausgeführt wird, lesen Sie diesen Artikel: Fehlerbehebung bei der CPU-Leistung unter VMware . Ich weiß, dass im Titel CPU steht, aber es gibt auch Informationen zu Speicherzählern.
Erik Darling
Ja, es ist ein Hyper-V-Host mit 3 Servern. Danke für die Info, ich werde es überprüfen
Charleh
Ich habe bisher festgestellt, dass der Host über genügend Speicher verfügt, um weitere 12 GB hinzuzufügen. Ich habe SQL 24 GB zugelassen (der Gast hat insgesamt bis zu 32 GB) und bisher scheint es viel gesünder zu sein, aber ich würde immer noch gerne verstehen, was los ist, da 14-16 GB mehr als genug für die Arbeitslast zu sein scheinen, die SQL verbraucht täglich ..
Charleh
1
Haben Sie Ballonfahren untersucht? Wenn VMWare den Ballon-Treiber hochpumpt, signalisiert das Betriebssystem wenig Arbeitsspeicher und SQL Server reagiert entsprechend. Der erste Schritt besteht darin, zu untersuchen, ob Sie Ballonfahrten haben oder nicht.
Tibor Karaszi

Antworten:

4

Obwohl Sie das Problem anscheinend selbst gelöst haben, finden Sie hier eine Zusammenfassung der relevanten Informationen zur Lösung.

Server Memory Server-Konfigurationsoptionen

Microsoft schreibt in seinem Artikel Server Memory Server-Konfigurationsoptionen (Microsoft | SQL Docs) für den Abschnitt Manuelles Festlegen der Speicheroptionen

( Hervorhebung von mir)

Das Festlegen eines min_server_memory- Werts ist in einer virtualisierten Umgebung unerlässlich, um sicherzustellen, dass der Speicherdruck des zugrunde liegenden Hosts nicht versucht, Speicher aus dem Pufferpool auf einer virtuellen SQL Server-Gastmaschine (VM) freizugeben, der über das für eine akzeptable Leistung erforderliche Maß hinausgeht.

Der Abschnitt über das Sperren von Seiten im Speicher (dasselbe Dokument) enthält einen gleich überzeugenden Absatz, der wie folgt lautet:

( Hervorhebung von mir)

Diese Windows-Richtlinie bestimmt, welche Konten einen Prozess verwenden können, um Daten im physischen Speicher zu speichern, wodurch verhindert wird , dass das System die Daten in den virtuellen Speicher auf der Festplatte paginiert . Durch das Sperren von Seiten im Speicher kann der Server reagieren, wenn Paging-Speicher auf die Festplatte übertragen wird. Die Option Seiten im Speicher sperren ist in Instanzen der SQL Server Standard Edition und höher auf EIN gesetzt, wenn dem Konto mit Berechtigungen zum Ausführen von sqlservr.exe das Benutzerrecht Windows-Seiten im Speicher sperren (LPIM) erteilt wurde.

Im Abschnitt LPIM wird Folgendes erklärt:

( Hervorhebung von mir)

Das Festlegen dieser Option wirkt sich nicht auf die dynamische Speicherverwaltung von SQL Server aus, sodass sie auf Anforderung anderer Speicherangestellter erweitert oder verkleinert werden kann. Wenn Sie das Benutzerrecht Seiten im Speicher sperren verwenden, wird empfohlen, eine Obergrenze für den maximalen Serverspeicher festzulegen, wie oben beschrieben.

... und in einem wichtigen Kommentar, dass:

( Hervorhebung von mir)

Das Festlegen dieser Option sollte nur bei Bedarf verwendet werden, wenn Anzeichen dafür vorliegen, dass der sqlservr-Prozess ausgelagert wird . In diesem Fall wird der Fehler 17890 im Fehlerprotokoll gemeldet, ähnlich dem folgenden Beispiel:

A significant part of sql server process memory has been paged out. 
This may result in a performance degradation. Duration: #### seconds. 
Working set (KB): ####, committed (KB): ####, memory utilization: ##%.  

Ab SQL Server 2012 (11.x) wird das Trace-Flag 845 für die Standard Edition nicht benötigt, um gesperrte Seiten zu verwenden.

Lösung

Basierend auf den obigen Erkenntnissen und Ihren Beobachtungen besteht die Lösung für Ihr Problem darin, die folgenden Einstellungen zu konfigurieren:

  1. min_server_memory (5-10 GB?) Basierend auf Ihrem Kommentar:

    Etwa 8-9 GB Daten im Cache scheinen derzeit stabil zu sein.

    ... und die Empfehlung von Microsoft, a min_server_memory.

  2. max_server_memory (20-32 GB) basierend auf Ihrer Beobachtung:

    Es scheint darauf hinzudeuten, dass 20 GB für die Arbeitslast auf dieser Box ausreichen. Ich bin froh, dass ich es jetzt mit 32 GB belasse, aber ich möchte dem wirklich auf den Grund gehen, damit ich die VMs / SQL besser konfigurieren kann.

    ... und die Empfehlung von Microsoft, a max_server_memory.

  3. Seiten im Speicher sperren : Aktiviert für SQL Server-Dienstkonto.
    Basierend auf dem ERRORLOG-Eintrag Ihrer von Ihnen erwähnten SQL Server-Instanz und der Microsoft-Referenz im Artikel.

    Das Festlegen dieser Option sollte nur bei Bedarf verwendet werden, wenn Anzeichen dafür vorliegen, dass der sqlservr-Prozess ausgelagert wird .

Bevor Sie fortfahren ...

(Einer der) Vorteile einer virtualisierten Umgebung besteht darin, dass Ressourcen gemeinsam genutzt werden können / sollten und möglicherweise sogar überlastet werden. Das Aktivieren von LPIM (Lock Pages In Memory) kann sich jedoch negativ auf Ihre Hyper-V-Umgebung auswirken, wenn auf Ihrer Hardware mehrere Instanzen gehostet werden. Eine Überbeanspruchung des Arbeitsspeichers kann andere Instanzen erschöpfen.

Bevor Sie alle Hebel umschalten, beginnen Sie mit den Einstellungen 1. und 2. Wenn die Feinabstimmung dieser Speichereinstellungen nicht funktioniert, sollten Sie LPIM aktivieren, wenn Sie über genügend Hardware verfügen .

John aka hot2use
quelle