Ich habe einige Leistungsprobleme mit einem Datenverarbeitungssystem, an dem ich arbeite. Ich habe Wartestatistiken von einem einstündigen Peroid gesammelt, die eine große Anzahl von CXPACKET- und LATCH_EX-Warteereignissen anzeigen.
Das System besteht aus 3 verarbeitenden SQL-Servern, die eine Menge Zahlenverarbeitung und Berechnungen durchführen und die Daten dann in einen zentralen Clusterserver einspeisen. Auf den Verarbeitungsservern können jeweils bis zu 6 Jobs gleichzeitig ausgeführt werden. Diese Wartestatistiken beziehen sich auf den zentralen Cluster, der meiner Meinung nach einen Engpass verursacht. Der zentrale Clusterserver verfügt über 16 Kerne und 64 GB RAM. MAXDOP ist auf 0 gesetzt.
Ich vermute, dass das CXPACKET von den mehreren parallelen Abfragen stammt, bin mir jedoch nicht sicher, was das LATCH_EX-Warteereignis anzeigt. Nach dem, was ich gelesen habe, könnte dies eine Wartezeit ohne Puffer sein?
Kann jemand vorschlagen, was die Ursache für solche Wartestatistiken ist und wie ich vorgehen sollte, um die Ursache für dieses Leistungsproblem zu ermitteln?
Die oberen Abfrageergebnisse sind die gesamten Wartestatistiken und die unteren Abfrageergebnisse sind die Statistiken über den Zeitraum von 1 Stunde
Antworten:
CXPACKET kann mit einem LATCH_XX (möglicherweise auch mit PAGEIOLATCH_XX oder SOS_SCHEDULER_YIELD) versehen werden. Wenn dies der Fall ist (und ich glaube es ist, basierend auf der Frage), sollte der MAXDOP-Wert gesenkt werden, um zu Ihrer Hardware zu passen.
Außerdem sind hier einige weitere empfohlene Schritte zum Diagnostizieren der Ursache für hohe CXPACKET-Wartestatistikwerte (bevor etwas in SQL Server geändert wird):
Setzen Sie MAXDOP nicht auf 1, da dies niemals die Lösung ist
Untersuchen Sie den Abfrage- und CXPACKET-Verlauf, um festzustellen, ob er nur ein- oder zweimal aufgetreten ist, da dies möglicherweise nur die Ausnahme im System ist, die normalerweise ordnungsgemäß funktioniert
Überprüfen Sie die Indizes und Statistiken der von der Abfrage verwendeten Tabellen und stellen Sie sicher, dass diese auf dem neuesten Stand sind
Überprüfen Sie den Kostengrenzwert für Parallelität (CTFP) und stellen Sie sicher, dass der verwendete Wert für Ihr System geeignet ist
Überprüfen Sie, ob dem CXPACKET ein LCK_M_XX beigefügt ist (normalerweise zusammen mit IO_COMPLETION und ASYNC_IO_COMPLETION). Wenn dies der Fall ist, ist Parallelität nicht der Engpass. Beheben Sie diese Wartestatistiken, um die Hauptursache für das Problem und die Lösung zu finden
Wenn Sie den CXPACKET-Wartetyp wirklich genau verstehen müssen, empfehle ich, den Artikel Fehlerbehebung beim CXPACKET-Wartetyp in SQL Server zu lesen
quelle
Lesen Sie Diagnostizieren und Beheben von Latch-Konflikten unter SQL Server. Dies ist das umfassendste Dokument zum Thema. Sie müssen herausfinden,
sys.dm_os_latch_stats
um welche Art von Verriegelung es sich handelt.Lesen Sie, ob das Analysieren der SQL Server-Leistung in irgendeiner Weise hilfreich ist.
quelle
Neben dem Lesen der oben angegebenen Links und dem Ändern der Einstellung "Maximaler Parallelitätsgrad" von 0 auf 8 möchten Sie eingrenzen, welche Ihrer Abfragen parallel verlaufen und welche Kosten sie verursachen.
Nachdem Sie die Auswirkungen dieser Änderung gesehen haben, können Sie auch überlegen, Ihren "Kostengrenzwert für Parallelität" zu ändern, um die Parallelität zu optimieren.
Hier ist ein großartiges Video von Brent Ozar, das Ihnen helfen wird: Beherrschen der Kunst von CXPACKET und MAXDOP
Ihr Ziel ist eine Wartezeit von <= 50% für CXPACKET. Viel Glück!!
quelle