Muss den Fehler bei der Ausführung paralleler Abfragen verstehen


18

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

Welchen Wert haben die max degree of parallelismkonfigurierten und wie viele Prozessoren befinden sich derzeit auf dem Server zusammen mit der NUMA-Konfiguration? Sie können verwenden coreinfo.exevon Sysinternals Anzahl der Prozessoren und NUMA - Konfiguration zu erfahren.
Kin Shah

Der maximale Parallelitätsgrad ist auf 0 eingestellt
Lumpy

Das erklärt, warum SQL Server nach Thread-Ressourcen hungern würde.
Kin Shah

@Kin Ich habe 12 Prozessoren (0 - 11) Prozessoren, dann zwei logische Prozessoren zur NUMA-Knotenzuordnung: Einträge Knoten 0, Knoten 1
Lumpy

@ Kin Ich dachte, dass 0 erwähnt, dass SQL Server verwaltet, wie viele Threads es verwenden sollte. Warum würde dies dazu führen, dass SQL Server nach Thread-Ressourcen hungert?
Lumpy

Antworten:


19

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_dumpssind, 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 von0 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:

  • Ausgedehnte lange Blockierungsketten führen dazu, dass SQL Server keine Arbeitsthreads mehr hat
  • Umfangreiche Parallelität führt auch zur Erschöpfung der Worker-Threads
  • Warten Sie lange auf jede Art von "Schloss" - Spinlocks, Riegel. Ein verwaistes Spinlock ist ein Beispiel.

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.


Gibt es irgendetwas, das auf eine unkontrollierte Abfrage hindeutet? Kann ich mit irgendetwas versuchen, Abfragen zu identifizieren, bei denen das Risiko besteht?
Lumpy

Schlagen Sie vor, in den Wartestatistiken nachzusehen, um herauszufinden, wo es weh tut . Auch sehen sys.dm_os_schedulers-> current_tasks_count, runnable_tasks_count, current_workers_count und active_workers_count sowie sys.dm_os_wait_statsundsys.dm_os_waiting_tasks
Kin Shah

10

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.


max worker threads Min = 128, max = 32767, config = 0, run = 0
Lumpy

2
@Lumpy Das ist dein Konfigurationsmaximum, aber das ist nicht annähernd das tatsächliche Maximum an Arbeitern. Wir müssten wissen, wie viele Prozessoren Ihre Maschine für die Berechnung benötigt.
Thomas Stringer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.