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.
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.
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 SIMPLE
auf FULL
machte 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.
quelle
FULL
oder befindetBULK_LOGGED
, so verhält, als ob sie sich in befindet,SIMPLE
bis Sie eine vollständige Sicherung durchführen.Antworten:
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:
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:
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.
quelle
C:
undD:
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.