SQL Server Cache Flush und Festplatten-E / A.


11

Wir testen gerade ein OLTP-System, das wir in .NET 4.0 entwickelt haben, und führen SQL Server 2008 R2 im Hintergrund aus. Das System verwendet SQL Server Service Broker-Warteschlangen, die sehr leistungsfähig sind, bei der Verarbeitung tritt jedoch ein besonderer Trend auf.

SQL Server verarbeitet Anforderungen 1 Minute lang mit einer Blasenrate, gefolgt von ~ 20 Sekunden erhöhter Schreibaktivität auf der Festplatte. Die folgende Grafik zeigt das Problem.

SQL OLTP System - Leistungsindikatoren

Yellow = Transactions per second
Blue   = Total CPU usage
Red    = Sqlsrv Disk Write Bytes/s
Green  = Sqlsrv Disk Read Bytes/s

Während der Fehlerbehebung haben wir Folgendes versucht, ohne das Muster wesentlich zu ändern:

  • SQL Server-Agent gestoppt.
  • Fast jeden anderen laufenden Prozess beendet (kein A / V, SSMS, VS, Windows Explorer usw.)
  • Alle anderen Datenbanken wurden entfernt.
  • Alle Konversations-Timer deaktiviert (wir verwenden keine Trigger).
  • Weg von einem Nachrichtenwarteschlangen-gesteuerten Ansatz zu einem einfachen / groben Tabellenüberwachungsdesign.
  • Verwendet verschiedene Lasten von leicht bis schwer.
  • Alle Deadlocks behoben.

Es scheint, als würde SQL Server seinen Cache aufbauen und ihn in bestimmten zeitbasierten Intervallen auf die Festplatte schreiben, aber ich kann online nichts finden, was diese Theorie unterstützt.

Als nächstes plane ich, die Lösung in unsere dedizierte Testumgebung zu verschieben, um zu sehen, ob ich das Problem replizieren kann. Jede Hilfe in der Zwischenzeit wäre sehr dankbar.

Update 1 Hiermit wird nach Bedarf ein Diagramm angezeigt, das die Checkpoint-Seiten / Sek. , Die Lebensdauer der Seite und einige Zähler für die Festplattenlatenz enthält.

SQL OLTP System - Leistungsindikatoren - Prüfpunkt

Es scheint, als ob der Checkpoint (hellblaue Linie) die Ursache für die verringerte Leistung (gelbe Linie) ist, die wir beobachten

Die Festplattenlatenz bleibt während der Verarbeitung relativ konstant, und die Lebenserwartung der Seiten scheint keine spürbaren Auswirkungen zu haben. Wir haben auch die für SQL Server verfügbare RAM-Menge angepasst, was ebenfalls keine großen Auswirkungen hatte. Das Ändern des Wiederherstellungsmodells von SIMPLEauf FULLmachte ebenfalls wenig Unterschied.

Update 2 Durch Ändern des "Wiederherstellungsintervalls" wie folgt ist es uns gelungen, das Intervall zu verringern, in dem Prüfpunkte auftreten:

EXEC sp_configure 'show advanced options',1
GO 

RECONFIGURE
GO

EXEC sp_configure 'recovery interval', '30'
GO

RECONFIGURE 
GO

EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE

Ich bin mir nicht sicher, ob dies eine schlechte Praxis ist.


1
Fügen Sie den Zähler für Prüfpunktseiten / Sek. Hinzu. Und nochmal testen und die Grafik zeigen. Und während Ihre Transaktionen sinken und die Schreibvorgänge steigen - sehen Sie Leistungsprobleme? Ich würde auch einige Zähler für die Latenz der Festplatte hinzufügen - durchschnittliche Sekunde / Lesen und durchschnittliche Sekunde / Schreiben
Mike Walsh

Und wenn Sie die nächsten Grafiken veröffentlichen, können Sie die Zahlen einschließen. Diese Grafik zeigt keine Skala.
Mike Walsh

5
Und noch eine letzte Sache (sorry!) - Was ist der Speicher auf diesem Server? Können Sie auch den Zähler für die Lebenserwartung von Seiten hinzufügen? Können Sie das physische Setup beschreiben (Speicher, E / A-Setup, haben Sie Ihre Protokoll- und Datendateien aufgeteilt usw.)
Mike Walsh

2
In welchem ​​Wiederherstellungsmodell befindet sich die Datenbank? Dies sieht nach automatischem Checkpointing aus, wenn das Transaktionsprotokoll voll ist. Beachten Sie, dass sich die Datenbank, selbst wenn sie sich in FULLoder befindet BULK_LOGGED, so verhält, als ob sie sich in befindet, SIMPLEbis Sie eine vollständige Sicherung durchführen.
Jon Seigel

2
Jon - Checkpointing wird unabhängig vom Wiederherstellungsmodell weiterhin durchgeführt. Vereinfacht: Der einzige Unterschied besteht darin, was nach einem Prüfpunkt in den Wiederherstellungsmodellen mit den Daten im Protokoll passiert. In vollem Umfang verbleibt es im Protokoll und muss gesichert werden. In einfachen Worten kann es abgeschnitten werden (oder zum Abschneiden markiert werden .. Wiederverwendung), aber der Checkpoint muss noch stattfinden.
Mike Walsh

Antworten:


11

Andere haben bereits auf den Schuldigen hingewiesen: SQL Server sammelt Aktualisierungen im Speicher (im Pufferpool) und löscht sie nur regelmäßig (an Prüfpunkten). Die beiden vorgeschlagenen Optionen (-k und Prüfpunktintervall) ergänzen sich:

Aber ich habe nicht nur geantwortet, um die feinen Kommentare, die Sie erhalten haben, weit zu wiederholen :)

Was Sie sehen, ist leider ein sehr typisches Verhalten der Verarbeitung in der Warteschlange . Unabhängig davon, ob Sie Service Broker-Warteschlangen verwenden oder Tabellen als Warteschlangen verwenden , ist das System sehr anfällig für diese Art von Verhalten. Dies liegt daran, dass die auf Warteschlangen basierende Verarbeitung schreibintensiv ist, sogar noch schreibintensiver als die OLTP-Verarbeitung. Sowohl Enqueue- als auch Dequeue-Grundelemente sind Schreiboperationen und es gibt fast keine Leseoperationen. Einfach ausgedrückt, die Warteschlangenverarbeitung generiert die meisten Schreibvorgänge (= die meisten schmutzigen Seiten und die meisten Protokolle) im Vergleich zu jeder anderen Arbeitslast, sogar OLTP (dh TPC-C- ähnliche Arbeitslast).

Sehr wichtig ist, dass die Schreibvorgänge einer Warteschlangen-Workload dem Einfüge- / Löschmuster folgen: Jede eingefügte Zeile wird sehr schnell gelöscht. Dies ist wichtig, um von einem Nur-Anhängen-Muster einer ETL-Workload (Insert Heavy) zu unterscheiden. Sie füttern die Geisterbereinigungsaufgabe im Grunde genommen mit einer vollen Mahlzeit, und Sie können sie leicht hinter sich lassen. Überlegen Sie, was das bedeutet:

  • enqueue ist eine Einfügung, es wird eine schmutzige Seite erstellt
  • Dequeue ist ein Löschvorgang, der dieselbe Seite erneut verschmutzt (es kann Glück haben und die Seite vor dem Checkpoint abfangen, so dass Doppelspülungen vermieden werden, aber nur, wenn Sie Glück haben).
  • Ghost Cleanup bereinigt die Seite und macht sie wieder schmutzig

Ja, es bedeutet wirklich, dass Sie möglicherweise eine Seite dreimal in drei verschiedenen E / A-Anforderungen für jede von Ihnen verarbeitete Nachricht auf die Festplatte schreiben (schlimmster Fall). Und es bedeutet auch, dass die zufällige E / A von Prüfpunkten wirklich zufällig ist, da der Schreibpunkt der Seite von diesen sich bewegenden Köpfen wieder zwischen zwei Prüfpunkten besucht wird (im Vergleich zu vielen OLTP-Workloads neigen die Schreibvorgänge dazu, die Schreibvorgänge an einigen "Hot Spots" zu gruppieren). keine Warteschlangen ...).

Sie haben also diese drei Schreibpunkte, die darauf abzielen, dieselbe Seite immer wieder als schmutzig zu markieren . Und das ist , bevor wir irgendwelche Seitenteilungen betrachten, die Queue - Verarbeitung kann anfällig sein , da der Einsatzschlüssel bestellen. Im Vergleich dazu weisen 'typische' OLTP-Workloads ein viel ausgeglicheneres Lese- / Schreibverhältnis auf, und die OLTP-Schreibvorgänge verteilen sich auf Einfügungen / Aktualisierungen / Löschungen, wobei häufig Aktualisierungen (Statusänderungen) und Einfügungen den Löwenanteil ausmachen. Schreibvorgänge für die Warteschlangenverarbeitung werden ausschließlich mit 50/50 Split eingefügt / gelöscht.

Einige Konsequenzen folgen:

  • Checkpoint wird zu einem sehr heißen Thema (keine Überraschung mehr für Sie)
  • Sie werden eine starke Fragmentierung feststellen (die Fragmentierung an sich spielt keine große Rolle, da Sie keine Entfernungsscans durchführen werden, aber Ihre E / A-Effizienz leidet und die Geisterbereinigung muss mehr funktionieren, was sie noch mehr verlangsamt).
  • Der zufällige E / A-Durchsatz Ihres MDF-Speichers wird Ihr Engpass sein

Meine Empfehlung besteht aus drei Buchstaben: S, S und D. Verschieben Sie Ihren MDF in einen Speicher, der schnelle zufällige E / A-Vorgänge verarbeiten kann. SSD. Fusion-IO, wenn Sie die Gelder haben. Leider ist dies eines der Symptome, die mit billigerem RAM nicht behoben werden können ...

Bearbeiten:

Wie Mark hervorhebt, haben Sie zwei logische Datenträger, die von einem physischen Datenträger unterstützt werden. Vielleicht haben Sie versucht, Best Practices zu befolgen und das Protokoll für D: und die Daten für C: aufzuteilen, aber leider ist es erfolglos, C und D sind gleich Festplatte sind. Zwischen den Checkpoints erreichen Sie einen sequentiellen Durchsatz. Sobald der Checkpoint startet, bewegen sich die Plattenköpfe und Ihr Protokolldurchsatz sinkt, wodurch der gesamte App-Durchsatz verringert wird. Stellen Sie sicher, dass Sie das DB-Protokoll trennen, damit es nicht von Daten-E / A (separater Datenträger) betroffen ist.


2
Übrigens wäre es interessant zu wissen, warum Checkpoint-gesteuerte E / A so dramatische Auswirkungen auf Anwendungszähler haben. Idealerweise sollte die Anwendung vorauspflügen, während der Kontrollpunkt seine Arbeit erledigt. Ich gehe natürlich davon aus, dass Sie keinen LDF- und MDF-Speicherzugriffspfad freigeben (wenn Sie dies tun, haben Sie es verdient ...). Möglicherweise haben Sie einige unnötige Streitpunkte in der Anwendung.
Remus Rusanu

Sehr schön gemacht antworte Remus.
Mark Storey-Smith

3
Wenn Sie sich die aufgeführten Perfmon-Zähler ansehen, vermuten Sie, dass Sie mit den Daten und Protokollen auf demselben Laufwerk oder Array Recht haben.
Mark Storey-Smith

@ MarkStorey-Smith: Ich denke, Sie haben Recht, OP hat C:und D:logische Festplatten, die von derselben physischen Festplatte unterstützt werden. Ich bezweifle, dass es sich bei der physischen Festplatte um eine Batterie mit 100 kurz gestreiften Spindeln handelt, daher ist dies wahrscheinlich die Hauptursache.
Remus Rusanu

Ja, dieser Test wurde auf meinem lokalen Entwicklungscomputer durchgeführt, der nur ein einziges Laufwerk hat. Vielen Dank für die Hilfe an alle.
André Hauptfleisch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.