sys.dm_os_schedulers (Transact-SQL)

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.

Spaltenname

Datentyp

Beschreibung

scheduler_address

varbinary(8)

Speicheradresse des Zeitplanungsmoduls. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

scheduler_id

int

ID des Zeitplanungsmoduls. Alle Zeitplanungsmodule, die zum Ausführen regulärer Abfragen verwendet werden, weisen IDs unter 255 auf. Zeitplanungsmodule mit IDs größer oder gleich 255 werden intern von SQL Server verwendet, wie z. B. das Zeitplanungsmodul für dedizierte Administratorverbindungen. NULL ist nicht zulässig.

cpu_id

smallint

ID der CPU, der dieses Zeitplanungsmodul zugeordnet ist. Wenn SQL Server für die Ausführung mit Affinität konfiguriert ist, ist der Wert die ID der CPU, auf der das Zeitplanungsmodul ausgeführt werden soll.

255 = Affinitätsmaske ist nicht angegeben.

NULL ist nicht zulässig.

status

nvarchar(60)

Zeigt den Status des Zeitplanungsmoduls an. Folgende Werte sind möglich:

  • HIDDEN ONLINE

  • HIDDEN OFFLINE

  • VISIBLE ONLINE

  • VISIBLE OFFLINE

  • VISIBLE ONLINE (DAC)

  • HOT_ADDED

NULL ist nicht zulässig.

Zeitplanungsmodule im Status HIDDEN werden zur Verarbeitung von Anforderungen verwendet, die intern für Database Engine (Datenbankmodul) 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

Wurde SQL Server so konfiguriert, dass nur einige der verfügbaren Prozessoren verwendet werden, kann diese Konfiguration bedeuten, dass einige Zeitplanungsmodule Prozessoren zugeordnet werden, die nicht in der Affinitätsmaske enthalten sind. 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.

NULL ist nicht zulässig.

is_idle

bit

1 = Das Zeitplanungsmodul befindet sich im Leerlauf. Zurzeit werden keine Arbeitsthreads ausgeführt. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

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

HinweisHinweis
Wenn die Position eines Arbeitsthreads im Zeitplanungsmodul freigegeben und der Thread in der Warteschlange ausführbarer Threads angeordnet wird, dann aber keine anderen Arbeitsthreads gefunden werden, wählt sich der Arbeitsthread 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. NULL ist nicht zulässig.

current_tasks_count

int

Anzahl von aktuellen Tasks, die diesem Zeitplanungsmodul zugeordnet sind. Dazu gehören die folgenden:

  • Tasks, die auf einen Arbeitsthread warten, um ausgeführt zu werden.

  • Tasks, die zurzeit warten oder ausgeführt werden (Status SUSPENDED oder RUNNABLE).

Nach Abschluss eines Tasks wird diese Anzahl verringert. NULL ist nicht zulässig.

runnable_tasks_count

int

Anzahl von Arbeitsthreads mit zugewiesenen Tasks, die darauf warten, in die ausführbare Warteschlange eingereiht zu werden. NULL ist nicht zulässig.

current_workers_count

int

Anzahl von diesem Zeitplanungsmodul zugeordneten Arbeitsthreads. Dies schließt Arbeitsthreads ein, die keinem Task zugeordnet sind. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

work_queue_count

bigint

Anzahl von Tasks in der ausstehenden Warteschlange. Diese Tasks warten darauf, von einem Arbeitsthread abgerufen zu werden. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

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. In SQL Server 2000 wird ein Task an ein bestimmtes Zeitplanungsmodul weitergeleitet. In SQL Server basiert dagegen die Entscheidung über die Weiterleitung auf der Belastung des Zeitplanungsmoduls. SQL Server verwendet auch einen Ladefaktor für Knoten und Zeitplanungsmodule, um die optimale Ressourcenquelle einfacher zu bestimmen. Nach dem Einreihen eines Tasks in die Warteschlange wird der Ladefaktor erhöht. Nach Abschluss eines Tasks wird der Ladefaktor verringert. Mithilfe von Ladefaktoren kann das SQL Server-Betriebssystem (SQLOS) die Arbeitsauslastung besser verteilen. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

last_timer_activity

bigint

Der letzte Zeitpunkt in CPU-Zeiteinheiten, zu dem die Zeitgeberwarteschlange des Zeitplanungsmoduls vom Zeitplanungsmodul überprüft wurde. NULL ist nicht zulässig.

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. NULL ist nicht zulässig.

task_memory_object_address

varbinary(8)

Speicheradresse des Speicherobjekts des Tasks. NULL ist nicht zulässig. Weitere Informationen finden Sie unter sys.dm_os_memory_objects (Transact-SQL).

Berechtigungen

Erfordert die VIEW SERVER STATE-Berechtigung auf dem Server.

Beispiele

A. Überwachen von verborgenen und nicht verborgenen Zeitplanungsmodulen

In der folgenden Abfrage wird der Status von Arbeitsthreads und Tasks in SQL Server in allen Zeitplanungsmodulen ausgegeben. 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;

Dies ist das Resultset.

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 Zeitplanungsmodule. Zwei Zeitplanungsmodule weisen einen ID-Wert < 255 auf. Zeitplanungsmodule mit einer ID >= 255 werden als verborgene Zeitplanungsmodule 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 Tasks gehören Benutzeranforderungen sowie Ressourcenverwaltungstasks, die von SQL Server gestartet wurden. Beispiele für SQL Server-Tasks sind RESOURCE MONITOR (einer pro NUMA-Knoten), LAZY WRITER (einer 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 startet in der Regel in einem anderen NUMA-Knoten als dem Knoten 0. Weitere Informationen finden Sie unter Grundlegendes zu NUMA (Non-Uniform Memory Access).

  • 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 Arbeitsthreads werden beim Start von SQL Server zugeordnet und nicht geändert. 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 Arbeitsthreads dar, die über zugeordnete Tasks verfügen und im nicht präemptiven 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 nicht verborgenen 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.

HinweisHinweis

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).

Im Folgenden wird die Abfrage aufgeführt:

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;

Dies ist das Resultset.

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