Der merkwürdige Fall von HADR_SYNC_COMMIT wartet

11

Wir bemerken ein interessantes Muster für HADR_SYNC_COMMITWartezeiten in unserer Umgebung. Wir haben eine drei Replik; Eine primäre, eine synchrone sekundäre und eine asynchrone sekundäre in einem Rechenzentrum, und wir haben gerade drei weitere ASYNC- Replikate in einem anderen Rechenzentrum hinzugefügt (~ 2400 Meilen voneinander entfernt).

Seitdem stellen wir eine enorme Zunahme der HADR_SYNC_COMMITWartezeiten fest. Wenn wir uns die aktiven Sitzungen ansehen, sehen wir eine Reihe von COMMIT TRANSACTIONAbfragen, die auf das SYNC-Replikat warten

Auf dem Screenshot können wir deutlich sehen, dass HADR_SYNC_COMMITam 29. Juni ein Wartesprung eintritt, und wir haben schließlich irgendwann am Mittag des 1. Juli 'zwei' der drei asynchronen Replikate im Remote-Rechenzentrum abgelegt. Das hat die Wartezeiten erheblich verkürzt.

Bild

Was wir bisher überprüft haben - Protokoll-Sendewarteschlange, Wiederherstellungswarteschlange, letzte gehärtete Zeit und letzte Festschreibungszeit auf den Remote-Replikaten. Wir haben während der Geschäftszeiten ununterbrochen kleine Transaktionen, und daher sind die Sendewarteschlangen zu einem bestimmten Zeitstempel (zwischen 60 KB und 1 MB) ziemlich klein.
Die Remote-Replikate sind fast synchron, es gibt kaum einen Unterschied zwischen der letzten Festschreibungszeit und der letzten gehärteten Zeit für eine einzelne LSN auf den Replikaten.

Die Netzwerk-Pipe ist 10G und wir haben die Sendepuffergröße von 256 Megabyte auf 2 GB geändert. Dies wurde unter der Annahme durchgeführt, dass das Netzwerk Pakete verworfen und erneut übertragen hat. So oder so schien das nicht viel zu helfen.

Ich frage mich also, was die ASYNC- Replikate mit HADR_SYNC_COMMITWartezeiten zu tun haben . Sollte das SYNC- Replikat nicht allein von diesem Wartetyp abhängen, was fehlt mir hier?

Arun Gopinath
quelle
1
Gibt es also tatsächlich ein Problem? Viele Leute schauen sich nur ihre Wartezeiten an und sagen, hey, das ist die höchste Wartezeit, es muss ein Problem sein! Ein Warten ist nur eine Zahl und es wird immer eine mit der höchsten Zahl geben - dies bedeutet nicht unbedingt, dass ein Leistungsproblem zu lösen ist. Speziell für dieses Warten haben Sie anscheinend die häufigste Ursache ausgeschlossen , und da Ihre Sekundärteile nicht zurückfallen, würde ich nicht viel Energie für dieses "Problem"
Aaron Bertrand
Sie haben ein anderes Symptom zusammen mit einer hohen Zahl in einem Wartezähler und können mit dem hohen Wartezähler korrelieren.
Aaron Bertrand
@ AaronBertrand Ja, das gibt es. Die aktiven Spids auf dem primären Replikat warten darauf, dass die Protokollblöcke auf dem sekundären Synchronisationsblock hart werden. Diese Verzögerung / Wartezeit führt wiederum dazu, dass die Anwendung drastisch verlangsamt wird. Das Warten auf pagelatch_up am 9. Juli, das Sie im Screenshot sehen, war auf Tempdb-Konflikte zurückzuführen (wartet auf der pfs-Seite). Wir haben weitere Dateien von der dba-Seite hinzugefügt, und die Anwendungsmitarbeiter haben die gespeicherten Prozeduren, die auf das Tempdb treffen, sehr häufig optimiert, um dieses Problem zu beheben. Zurück zu hadr_sync_waits, warum wirken sich die asynchronen Commits überhaupt auf die hadr_sync_commits aus? Vielen Dank.
Arun Gopinath
1
Ich würde vermuten, dass die Wartezeit die Übertragungszeit beinhaltet und die Daten zusammen übertragen werden. Der Async muss einfach nicht auf die Festschreibungsbestätigung warten. Je mehr Secondaries Sie haben, egal ob synchron oder asynchron, desto mehr Zeit wird für die Übertragung der Protokollaktivität aufgewendet (dies ist nicht unbedingt die Uhrzeit, da einige davon gleichzeitig auftreten können). Möglicherweise möchten Sie, dass die Netzwerkmitarbeiter versuchen, festzustellen, ob im Allgemeinen oder beim Hinzufügen weiterer Sekundärdateien eine übermäßige Latenz auftritt.
Aaron Bertrand

Antworten:

7

Zunächst lautet die Beschreibung des Warteereignisses, auf das sich Ihre Frage bezieht:

Warten auf die Transaktions-Commit-Verarbeitung für die synchronisierten sekundären Datenbanken, um das Protokoll zu sichern. Diese Wartezeit spiegelt sich auch im Leistungsindikator für die Transaktionsverzögerung wider. Dieser Wartetyp wird für synchronisierte Verfügbarkeitsgruppen erwartet und gibt die Zeit an, zu der das Protokoll an die sekundären Datenbanken gesendet, geschrieben und bestätigt werden soll.

https://msdn.microsoft.com/en-us/library/ms179984.aspx

Wenn Sie sich mit der Mechanik dieser Wartezeit befassen, werden die Protokollblöcke übertragen und gehärtet, aber die Wiederherstellung wird auf den Remoteservern nicht abgeschlossen. In diesem Fall und angesichts der Tatsache, dass Sie zusätzliche Replikate hinzugefügt haben, liegt es nahe, dass sich Ihr HADR_SYNC_COMMIT aufgrund des Anstiegs der Bandbreitenanforderungen erhöhen kann. In diesem Fall ist Aaron Bertrand in seinen Kommentaren zu der Frage genau richtig.

Quelle: http://blogs.msdn.com/b/psssql/archive/2013/04/26/alwayson-hadron-learning-series-hadr-sync-commit-vs-writelog-wait.aspx

Sehen Sie sich den zweiten Teil Ihrer Frage an, wie diese Wartezeit mit Anwendungsverlangsamungen zusammenhängen kann. Dies ist meines Erachtens ein Kausalitätsproblem. Sie sehen, wie Ihre Wartezeiten zunehmen und eine kürzlich erfolgte Benutzerbeschwerde vorliegt, und ziehen möglicherweise fälschlicherweise die Schlussfolgerung, dass die beiden eine Beziehung haben, wenn dies möglicherweise überhaupt nicht der Fall ist. Die Tatsache, dass Sie Tempdb-Dateien hinzugefügt haben und Ihre Anwendung schneller auf mich reagiert hat, weist darauf hin, dass möglicherweise einige zugrunde liegende Konfliktprobleme aufgetreten sind, die durch den zusätzlichen Overhead des impliziten Overheads der Snapshot-Isolationsstufe, wenn sich eine Datenbank in einer Verfügbarkeitsgruppe befindet, möglicherweise noch verstärkt wurden. Dies hat möglicherweise wenig oder gar nichts mit Ihren HADR_SYNC_COMMIT-Wartezeiten zu tun.

Wenn Sie dies testen möchten, können Sie eine erweiterte Ereignisablaufverfolgung verwenden, die das hadr_db_commit_mgr_update_harden XEvent auf Ihrem primären Replikat überprüft und eine Baseline abruft. Sobald Sie Ihre Baseline haben, können Sie Ihre Replikate einzeln wieder hinzufügen und sehen, wie sich der Trace ändert. Ich würde Ihnen dringend empfehlen, eine Datei zu verwenden, die sich auf einem Volume befindet, das keine Datenbanken enthält, und einen Rollover und eine maximale Größe festzulegen. Passen Sie den Dauerfilter nach Bedarf an, um Ereignisse zu erfassen, die mit Ihren Wartezeiten übereinstimmen, damit Sie weitere Fehler beheben und diese mit anderen beteiligten Teams korrelieren können.

CREATE EVENT SESSION [HADR_SYNC_COMMIT-Monitor] ON SERVER  -- Run this on the primary replica 
ADD EVENT sqlserver.hadr_db_commit_mgr_update_harden(
    WHERE ([delay]>(10))) -- I strongly encourage you to use the delay filter to avoid getting too many events back, this is measured in milliseconds
ADD TARGET package0.event_file(SET filename=N'<YourFilePathHere>')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Travis Page
quelle