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.
FULL
oder befindet BULK_LOGGED
, so verhält, als ob sie sich in befindet, SIMPLE
bis Sie eine vollständige Sicherung durchführen.