sys.dm_os_schedulers (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Gibt eine Zeile pro Zeitplanungsmodul in SQL Server zurück, wobei jedes Zeitplanungsmodul einem einzelnen Prozessor zugeordnet ist. Mithilfe dieser Sicht können Sie den Zustand eines Zeitplanungsmoduls überwachen oder Endlostasks identifizieren. Weitere Informationen zu Schedulern finden Sie im Leitfaden zur Thread- und Aufgabenarchitektur.

Hinweis

Um dies von Azure Synapse Analytics oder Analytics Platform System (PDW) aufzurufen, verwenden Sie den Namen sys.dm_pdw_nodes_os_schedulers. Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Spaltenname Datentyp Beschreibung
scheduler_address varbinary(8) Speicheradresse des Zeitplanungsmoduls. Lässt keine NULL-Werte zu.
parent_node_id int ID des Knotens, zu dem das Zeitplanungsmodul gehört, der auch als übergeordneter Knoten bezeichnet wird. Dies stellt einen NUMA-Knoten (Non-Uniform Memory Access) dar. Lässt keine NULL-Werte zu.
scheduler_id int ID des Zeitplanungsmoduls. Alle Zeitplanungsmodule, die zum Ausführen regulärer Abfragen verwendet werden, weisen IDs unter 1048576 auf. Diese Planer, die über IDs verfügen, die größer oder gleich 1048576 sind, werden intern von SQL Server verwendet, z. B. der dedizierte Administratorverbindungsplaner. Lässt keine NULL-Werte zu.
cpu_id smallint Die zugewiesene CPU-ID des Zeitplanungsmoduls.

Lässt keine NULL-Werte zu.

Hinweis: 255 gibt keine Affinität wie in SQL Server 2005 (9.x) an. Weitere Affinitätsinformationen finden Sie unter sys.dm_os_threads (Transact-SQL ).
status nvarchar(60) Zeigt den Status des Zeitplanungsmoduls an. Folgenden Werte sind möglich:

- AUSGEBLENDET ONLINE
- AUSGEBLENDET OFFLINE
- SICHTBAR ONLINE
- SICHTBAR OFFLINE
- VISIBLE ONLINE (DAC)
- HOT_ADDED

Lässt keine NULL-Werte zu.

AUSGEBLENDETe Scheduler werden verwendet, um Anforderungen zu verarbeiten, die für die Datenbank-Engine intern sind. Zeitplanungsmodule im Status VISIBLE dienen zur Verarbeitung von Benutzeranforderungen.

Zeitplanungsmodule im Status OFFLINE sind Prozessoren zugeordnet, die in der Affinitätsmaske als offline markiert sind und daher nicht zur Verarbeitung von Anforderungen verwendet werden. Zeitplanungsmodule im Status ONLINE sind Prozessoren zugeordnet, die in der Affinitätsmaske als online markiert sind und zur Verarbeitung von Threads zur Verfügung stehen.

DAC bezeichnet das Zeitplanungsmodul, das über eine dedizierte Administratorverbindung ausgeführt wird.

HOT ADDED gibt an, dass die Zeitplanungsmodule als Reaktion auf ein Hinzufügen von CPUs im laufenden Systembetrieb hinzugefügt wurden.
is_online bit Wenn SQL Server so konfiguriert ist, dass nur einige der verfügbaren Prozessoren auf dem Server verwendet werden, kann diese Konfiguration bedeuten, dass einige Scheduler Prozessoren zugeordnet sind, die sich nicht in der Affinitätsmaske befinden. In diesem Fall gibt diese Spalte 0 zurück. Dieser Wert bedeutet, dass das Zeitplanungsmodul nicht für die Verarbeitung von Abfragen oder Batches verwendet wird.

Lässt keine NULL-Werte zu.
is_idle bit 1 = Das Zeitplanungsmodul befindet sich im Leerlauf. Zurzeit werden keine Arbeitsthreads ausgeführt. Lässt keine NULL-Werte zu.
preemptive_switches_count int Häufigkeit, mit der Arbeitsthreads in diesem Zeitplanungsmodul in den präemptiven Modus gewechselt sind.

Für die Ausführung von Code außerhalb von SQL Server (z. B. erweiterte gespeicherte Prozeduren und verteilte Abfragen) muss ein Thread außerhalb der Steuerung des nicht präemptiven Zeitplanungsmoduls ausgeführt werden. Dazu wechselt ein Arbeitsthread in den präemptiven Modus.
context_switches_count int Anzahl der Kontextwechsel in diesem Zeitplanungsmodul. Lässt keine NULL-Werte zu.

Damit andere Arbeitsthreads ausgeführt werden können, muss der aktuelle Arbeitsthread die Steuerung des Zeitplanungsmoduls freiwillig aufgeben oder den Kontext wechseln.

Hinweis: Wenn ein Mitarbeiter den Zeitplan zurückgibt und sich in die lauffähige Warteschlange einfügt und dann keine anderen Mitarbeiter findet, wählt der Worker sich selbst aus. In diesem Fall wird context_switches_count nicht aktualisiert, yield_count wird jedoch aktualisiert.
idle_switches_count int Häufigkeit, mit der das Zeitplanungsmodul im Leerlauf auf ein Ereignis gewartet hat. Diese Spalte entspricht context_switches_count. Lässt keine NULL-Werte zu.
current_tasks_count int Anzahl von aktuellen Tasks, die diesem Zeitplanungsmodul zugeordnet sind. Dazu gehören die folgenden:

– Aufgaben, die darauf warten, dass ein Worker sie ausführt.
– Aufgaben, die derzeit warten oder ausgeführt werden (im Zustand "ANGEHALTEN" oder "RUNNABLE").

Nach Abschluss eines Tasks wird diese Anzahl verringert. Lässt keine NULL-Werte zu.
runnable_tasks_count int Anzahl von Arbeitsthreads mit zugewiesenen Tasks, die darauf warten, in die ausführbare Warteschlange eingereiht zu werden. Lässt keine NULL-Werte zu.
current_workers_count int Anzahl von diesem Zeitplanungsmodul zugeordneten Arbeitsthreads. Dies schließt Arbeitsthreads ein, die keinem Task zugeordnet sind. Lässt keine NULL-Werte zu.
active_workers_count int Anzahl der aktiven Arbeitsthreads. Ein aktiver Arbeitsthread ist nie präemptiv, muss über einen zugewiesenen Task verfügen und wird entweder ausgeführt, ist ausführbar oder wurde angehalten. Lässt keine NULL-Werte zu.
work_queue_count bigint Anzahl von Tasks in der ausstehenden Warteschlange. Diese Tasks warten darauf, von einem Arbeitsthread abgerufen zu werden. Lässt keine NULL-Werte zu.
pending_disk_io_count int Anzahl von ausstehenden E/A-Vorgängen, die abgeschlossen werden sollen. Jedes Zeitplanungsmodul verfügt über eine Liste ausstehender E/A-Vorgänge, die überprüft werden, um bei einem Kontextwechsel zu bestimmen, ob sie abgeschlossen wurden. Die Anzahl wird um Eins inkrementiert, wenn die Anforderung eingefügt wird. Diese Anzahl wird um Eins verringert, wenn die Anforderung abgeschlossen ist. Diese Anzahl gibt nicht den Status der E/A-Vorgänge an. Lässt keine NULL-Werte zu.
load_factor int Interner Wert, der die Belastung dieses Zeitplanungsmoduls angibt. Mit diesem Wert wird bestimmt, ob ein neuer Task an dieses Zeitplanungsmodul oder ein anderes Zeitplanungsmodul gerichtet werden soll. Dieser Wert eignet sich vor allem zu Debugzwecken, wenn die Belastung der Zeitplanungsmodule nicht gleichmäßig verteilt zu sein scheint. Die Entscheidung über die Weiterleitung basiert auf der Belastung des Zeitplanungsmoduls. SQL Server verwendet auch einen Lastfaktor von Knoten und Planern, um den besten Speicherort zum Abrufen von Ressourcen zu ermitteln. Nach dem Einreihen eines Tasks in die Warteschlange wird der Ladefaktor erhöht. Nach Abschluss eines Tasks wird der Ladefaktor verringert. Die Verwendung der Ladefaktoren trägt dazu bei, dass die Arbeitslast von SQL Server besser ausgeglichen wird. Lässt keine NULL-Werte zu.
yield_count int Interner Wert zur Angabe des Fortschritts in diesem Zeitplanungsmodul. Mit diesem Wert wird von der Zeitplanungsmodul-Überwachung bestimmt, ob im Zeitplanungsmodul ein Arbeitsthread vorhanden ist, dessen Position nicht rechtzeitig für andere Arbeitsthreads freigegeben wird. Dieser Wert gibt nicht an, dass der Arbeitsthread oder Task in einen neuen Arbeitsthread gewechselt hat. Lässt keine NULL-Werte zu.
last_timer_activity bigint Der letzte Zeitpunkt in CPU-Takten, zu dem die Zeitgeberwarteschlange des Zeitplanungsmoduls vom Zeitplanungsmodul überprüft wurde. Lässt keine NULL-Werte zu.
failed_to_create_worker bit Bei der Einstellung 1 konnte kein neuer Arbeitsthread in diesem Zeitplanungsmodul erstellt werden. Dies tritt in der Regel aufgrund von Speicherbeschränkungen auf. Lässt NULL-Werte zu.
active_worker_address varbinary(8) Speicheradresse des derzeit aktiven Arbeitsthreads. Lässt NULL-Werte zu. Weitere Informationen finden Sie unter sys.dm_os_workers (Transact-SQL).
memory_object_address varbinary(8) Speicheradresse des Speicherobjekts des Zeitplanungsmoduls. Lässt keine NULL-Werte zu.
task_memory_object_address varbinary(8) Speicheradresse des Speicherobjekts des Tasks. Lässt keine NULL-Werte zu. Weitere Informationen finden Sie unter sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt. Macht das von SQLOS verwendete Scheduler-Quantum verfügbar.
total_cpu_usage_ms bigint Gilt für: SQL Server 2016 (13.x) und höher

Von diesem Planer verbrauchte CPU insgesamt, wie von nicht preemptiven Mitarbeitern gemeldet. Lässt keine NULL-Werte zu.
total_cpu_idle_capped_ms bigint Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt. Gibt die Drosselung basierend auf dem Ziel der Serviceebene an, ist für Nicht-Azure-Versionen von SQL Server immer 0. Lässt NULL-Werte zu.
total_scheduler_delay_ms bigint Gilt für: SQL Server 2016 (13.x) und höher

Die Zeit zwischen einem Arbeitswechsel und einem anderen Wechsel. Kann durch preemptive Mitarbeiter verursacht werden, die die Planung des nächsten nicht preemptiven Workers verzögern, oder aufgrund der Betriebssystemplanungsthreads aus anderen Prozessen. Lässt keine NULL-Werte zu.
ideal_workers_limit int Gilt für: SQL Server 2019 (15.x) und höher

Wie viele Mitarbeiter idealerweise auf dem Planer sein sollten. Wenn die derzeitigen Arbeitnehmer den Grenzwert aufgrund einer unausgewogenen Vorgangslast überschreiten, werden sie im Leerlauf gekürzt. Lässt keine NULL-Werte zu.
pdw_node_id int Gilt für: Azure Synapse Analytics, Analytics Platform System (PDW)

Der Bezeichner für den Knoten, auf dem sich diese Verteilung befindet.

Berechtigungen

Für SQL Server und SQL Managed Instance ist die VIEW SERVER STATE-Berechtigung erforderlich.

Für die SQL-Datenbank-Ziele Basic, S0 und S1 sowie für Datenbanken in Pools für elastische Datenbanken ist das Konto des Serveradministrators oder des Microsoft Entra-Administratorkontos oder die Mitgliedschaft in der ##MS_ServerStateReader## Serverrolle erforderlich. Für alle anderen SQL-Datenbank-Dienstziele ist entweder die VIEW DATABASE STATE-Berechtigung für die Datenbank oder die Mitgliedschaft in der ##MS_ServerStateReader##-Serverrolle erforderlich.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.

Beispiele

A. Überwachend ausgeblendeter und eingeblendeter Zeitplanungsmodule

Die folgende Abfrage gibt den Status von Workern und Aufgaben in SQL Server für alle Planer aus. Diese Abfrage wurde auf einem Computersystem mit folgenden Eigenschaften ausgeführt:

  • Zwei Prozessoren (CPUs)

  • Zwei (NUMA-)Knoten

  • Eine CPU pro NUMA-Knoten

  • Auf 0x03 festgelegte Affinitätsmaske.

SELECT  
    scheduler_id,  
    cpu_id,  
    parent_node_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers;  

Hier sehen Sie das Ergebnis.

scheduler_id cpu_id parent_node_id current_tasks_count  
------------ ------ -------------- -------------------  
0            1      0              9                    
257          255    0              1                    
1            0      1              10                   
258          255    1              1                    
255          255    32             2                    
  
runnable_tasks_count current_workers_count  
-------------------- ---------------------  
0                    11                     
0                    1                      
0                    18                     
0                    1                      
0                    3                      
  
active_workers_count work_queue_count  
-------------------- --------------------  
6                    0  
1                    0  
8                    0  
1                    0  
1                    0  

Die Ausgabe stellt die folgenden Informationen bereit:

  • Es gibt fünf Planer. Zwei Scheduler verfügen über einen ID-Wert < 1048576. Scheduler mit ID >= 1048576 werden als ausgeblendete Scheduler bezeichnet. Das Zeitplanungsmodul 255 stellt die dedizierte Administratorverbindung (Dedicated Administrator Connection, DAC) dar. Es gibt ein DAC-Zeitplanungsmodul pro Instanz. Ressourcenmonitore, die knappen Arbeitsspeicher koordinieren, verwenden die Zeitplanungsmodule 257 und 258, einen pro NUMA-Knoten.

  • In der Ausgabe gibt es 23 aktive Tasks. Zu diesen Aufgaben gehören Benutzeranforderungen zusätzlich zu Ressourcenverwaltungsaufgaben, die von SQL Server gestartet wurden. Beispiele für SQL Server-Aufgaben sind RESOURCE MONITOR (ein pro NUMA-Knoten), LAZY WRITER (eins pro NUMA-Knoten), LOCK MONITOR, CHECKPOINT und LOG WRITER.

  • Der NUMA-Knoten 0 wird der CPU 1 zugeordnet und der NUMA-Knoten 1 der CPU 0. SQL Server beginnt in der Regel auf einem anderen KNOTEN ALS Knoten 0.

  • Wenn runnable_tasks_count den Wert 0 zurückgibt, gibt es keine aktiv ausgeführten Tasks. Es sind jedoch möglicherweise aktive Sitzungen vorhanden.

  • Dem Zeitplanungsmodul 255, das DAC darstellt, sind 3 Arbeitsthreads zugeordnet. Diese Mitarbeiter werden beim Starten von SQL Server zugewiesen und ändern sich nicht. Diese Arbeitsthreads werden nur zur Verarbeitung von DAC-Abfragen verwendet. Die beiden Tasks in diesem Zeitplanungsmodul stellen einen Verbindungs-Manager und einen im Leerlauf befindlichen Arbeitsthread dar.

  • active_workers_count stellt alle Mitarbeiter dar, die zugeordnete Aufgaben haben und im nicht präventiven Modus ausgeführt werden. Einige Tasks, z. B. zur Netzwerküberwachung, werden mit präemptiver Zeitplanung ausgeführt.

  • Verborgene Zeitplanungsmodule verarbeiten keine typischen Benutzeranforderungen. Das DAC-Zeitplanungsmodul ist die Ausnahme. Dieses DAC-Zeitplanungsmodul verfügt über einen Thread zum Verarbeiten von Anforderungen.

B. Überwachen von eingeblendeten Zeitplanungsmodulen in einem ausgelasteten System

In der folgenden Abfrage wird der Status von stark ausgelasteten nicht verborgenen Zeitplanungsmodulen angezeigt, bei denen mehr Anforderungen vorhanden sind, als von verfügbaren Arbeitsthreads verarbeitet werden können. In diesem Beispiel werden 256 Arbeitsthreads Tasks zugewiesen. Einige Tasks warten auf die Zuweisung zu einem Arbeitsthread. Eine niedrige Anzahl von ausführbaren Tasks impliziert, dass mehrere Tasks auf eine Ressource warten.

Hinweis

Sie können den Status von Arbeitsthreads herausfinden, indem Sie sys.dm_os_workers abfragen. Weitere Informationen finden Sie unter sys.dm_os_workers (Transact-SQL).

Hier ist die Abfrage:

SELECT  
    scheduler_id,  
    cpu_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers  
  WHERE scheduler_id < 255;  

Hier sehen Sie das Ergebnis.

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            144                 0                     
1            147                 1                     
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   125                  16  
128                   126                  19  

Im Vergleich dazu werden im folgenden Ergebnis mehrere ausführbare Tasks angezeigt, wobei kein Task darauf wartet, einen Arbeitsthread zu erhalten. Der Wert von work_queue_count beträgt für beide Zeitplanungsmodule 0.

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            107                 98                    
1            110                 100                   
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   104                  0  
128                   108                  0  

Siehe auch

Dynamische Verwaltungssichten in Verbindung mit dem SQL Server-Betriebssystem (Transact-SQL)