Heute haben wir einen Leistungsabfall auf unserem Produktions-SQL-Server festgestellt. Während dieser Zeit haben wir mehrere "The query processor could not start the necessary thread resources for parallel query execution"
Fehler protokolliert . Die Lektüre, die ich gemacht habe, legt nahe, dass dies damit zusammenhängt, wie viele CPUs beim Ausführen einer komplexen Abfrage verwendet werden sollen. Als ich jedoch während des Ausfalls unsere CPU Utilization was only at 7%
. Gibt es noch etwas, auf das ich noch nicht gestoßen bin? Ist dies ein wahrscheinlicher Grund für den Leistungsabfall oder verfolge ich einen roten Hering?
Meine sp_configure-Werte dafür sind wie folgt:
name minimum maximum config_value run_value
cost threshold for parallelism 0 32767 5 5
max degree of parallelism
konfigurierten und wie viele Prozessoren befinden sich derzeit auf dem Server zusammen mit der NUMA-Konfiguration? Sie können verwendencoreinfo.exe
von Sysinternals Anzahl der Prozessoren und NUMA - Konfiguration zu erfahren.Antworten:
Vor ein paar Monaten sah ich mich mit einer ähnlichen Situation konfrontiert, in der die MAXDOP-Einstellung als Standardeinstellung festgelegt war und alle Worker-Threads durch eine Run Away-Abfrage erschöpft waren.
Remus wies darauf hin, dass dies als Verhungern des Arbeiterthreads bezeichnet wird .
In diesem Fall wird auf Ihrem Server ein Speicherauszug erstellt.
Wenn Sie auf 2008R2 + SP1 und höher
sys.dm_server_memory_dumps
sind, erhalten Sie auch den Speicherort der Dump-Datei.Nun zurück zum Problem:
Es gibt 1 Scheduler-Monitor-Thread pro NUMA-Knoten, und da Sie 2 NUMA-Knoten haben, gibt es 2 Scheduler-Monitor-Threads, die alle 60 Sekunden für diesen bestimmten NUMA-Knoten für die Integritätsprüfung aller Scheduler verantwortlich sind, während sichergestellt wird, dass der Scheduler nicht mehr reagiert oder nicht.
Jedes Mal, wenn eine neue Arbeitsanforderung aus der Worker-Warteschlange des Schedulers abgerufen wird, werden die Arbeitsvorgänge ausgeführt werden Zähler erhöht. Wenn sich also eine Arbeitsanforderung in der Warteschlange des Schedulers befindet und innerhalb von 60 Sekunden keine der Arbeitsanforderungen verarbeitet hat, wird der Scheduler als blockiert betrachtet.
Aufgrund einer Run-Away-Abfrage oder einer umfangreichen Parallelität tritt ein Zustand auf, in dem Worker-Threads erschöpft sind, da alle Threads von dieser einzelnen Run-Away-Abfrage oder übermäßig langen Blockierungen belegt sind und keine Arbeit ausgeführt werden kann, es sei denn, dieser fehlerhafte Prozess wird abgebrochen.
Am besten stimmen Sie zuerst die Einstellung für den maximalen Parallelitätsgrad ab . Standard von
0
bedeutet, dass SQL Server alle verfügbaren CPUs für die parallele Verarbeitung verwenden kann, indem alle Arbeitsthreads erschöpft werden.Es gibt viele Gründe, die zur Erschöpfung von Arbeitsthreads führen können:
Lesen Sie hier meine Antwort , die Ihnen zeigt, wie Sie den MAXDOP-Wert für Ihre Serverinstanz berechnen können.
Es wird außerdem dringend empfohlen, Wartestatistikinformationen zu Ihrer Datenbankserverinstanz zu erfassen.
quelle
sys.dm_os_schedulers
-> current_tasks_count, runnable_tasks_count, current_workers_count und active_workers_count sowiesys.dm_os_wait_stats
undsys.dm_os_waiting_tasks
Das kann mehrere Gründe haben. Höchstwahrscheinlich waren Sie arbeitslos. Sehen
max_worker_threads
. Die Bedingung heißt "Arbeiterstravation". Die Arbeiter könnten auf eine von mehreren Arten gestohlen werden (keine davon würde übrigens zu einer hohen CPU-Auslastung führen), zum Beispiel, wenn viele Anfragen blockiert werden oder dumme Dinge in der CLR getan werden (z. B. HTTP-Anfragen).Das Symptom, das Sie sehen, ist das Opfer des Problems, nicht die Ursache. Wir können keine Lösung empfehlen, ohne die Ursache zu kennen. Sie müssen Leistungsindikatoren und DMVs sammeln und im ERRORLOG nach weiteren Informationen suchen.
quelle