Ich habe einen Server mit 16 CPUs, der mit einer max degree of parallelism
8 und einer max worker threads
Einstellung von Null konfiguriert ist .
Während einer bestimmten Stunde betrug meine Signalwartezeit 20%, aber meine CPU-Auslastung des Betriebssystems stieg in dieser Zeit nie über 25%. Kann jemand erklären, warum meine Signalwartezeiten so hoch waren?
Mein Anbieter verfügt über ein erstklassiges Bewertungssystem, das erwartet, dass wir 10% oder weniger Signalwartezeiten haben, oder wir werden dinged. Wie kann ich das beheben (ohne zusätzliche CPUs hinzuzufügen)?
- Wir haben nicht mehr als 8 CPUs pro NUMA-Knoten, daher gilt das Trace-Flag 8048 nicht.
- Die größten Instanzwartezeiten sind
CXPACKET
(70%), dannPREEMPTIVE_OS_PIPEOPS
(20%) cost threshold for parallelism
ist auf 50 eingestellt. Soll ich es erhöhen? Zu was?- Dies ist eine physische Maschine (keine VM), die für SQL Server reserviert ist.
- Ich verwende ein Überwachungstool, um die am häufigsten ausgeführten Abfragen und Verfahren zu identifizieren. Möchte ich eine hohe CPU, eine hohe E / A oder eine hohe Dauer betrachten? Normalerweise ist unsere App E / A-intensiv, daher stelle ich hohe E / A ein. Aber da das Problem Signalwartezeiten ist, muss ich mir die hohe CPU ansehen?
- Ich hatte gehofft, Max Vernons Empfehlung zu vermeiden ,
MAXDOP
auf 4 zu senken , da die App einige Abfragen im Warehouse-Stil ausführt, für die zusätzliche Threads erforderlich sind.
sql-server
performance
Chris Woods
quelle
quelle
Antworten:
Community Wiki Antwort generiert aus Kommentaren zu der Frage von Aaron .
Sofern Sie keine Leistungsprobleme haben, ist der hohe Prozentsatz an
CXPACKET
Wartezeiten möglicherweise nur ein Indikator dafür, dass ein großer Teil der Abfragen parallel verläuft und eigentlich kein Problem darstellt.Eine hohe CPU könnte ein Indikator sein, aber von dem, was Sie erklärt haben, würde ich sagen, dass Sie sich Abfragen mit langer Dauer, aber zunächst niedriger CPU ansehen sollten. Das
CXPACKET
Warten ist manchmal mit einer Abfrage verbunden, die darauf wartet, dass alle Threads beendet sind, bevor die Ergebnisse zusammengeführt werden können (Datenversatz).Wenn Sie in der Lage sind, die Abfragen und Prozeduren zu ändern, können Sie
MAXDOP
für die benötigten Lageraufgaben eine höhere und für die globaleMAXDOP
niedrigere eine niedrigere festlegen . Ich würde das jedoch nur als letzten Ausweg tun. Sie möchten diese Arten von expliziten Hinweisen nur dann wirklich machen, wenn Sie alle Möglichkeiten ausgeschöpft haben oder keine Änderungen am Code, den Abfragen oder den Datenbankschemata vornehmen können.quelle