sys.dm_os_schedulers (Transact-SQL)
SQL Server のスケジューラごとに 1 行のデータを返します。SQL Server では、各スケジューラは個別のプロセッサにマップされています。 このビューは、スケジューラの状況の監視やランナウェイ タスクの特定に使用できます。
列名 |
データ型 |
説明 |
||
---|---|---|---|---|
scheduler_address |
varbinary(8) |
スケジューラのメモリ アドレス。 NULL 値は許可されません。 |
||
parent_node_id |
int |
スケジューラが属するノード (親ノード) の ID。 これは非均質メモリ アクセス (NUMA) ノードを表します。 NULL 値は許可されません。 |
||
scheduler_id |
int |
スケジューラの ID。 定期的なクエリの実行に使用されるスケジューラにはすべて、1048576 未満の ID 番号が付いています。 ID が 1048576 以上のスケジューラは、専用管理者接続のスケジューラなど、SQL Server 内部で使用されるスケジューラです。 NULL 値は許可されません。 |
||
cpu_id |
smallint |
スケジューラに割り当てられた CPU ID。 NULL 値は許可されません。
|
||
status |
nvarchar(60) |
スケジューラの状態。 次の値のいずれかです。
NULL 値は許可されません。 HIDDEN スケジューラは、データベース エンジンの内部的な要求の処理に使用されます。 VISIBLE スケジューラは、ユーザーの要求の処理に使用されます。 OFFLINE スケジューラは、関係マスクでオフラインになっているプロセッサにマップされます。そのため、要求の処理には使用されません。 ONLINE スケジューラは、関係マスクでオンラインになっているプロセッサにマップされ、スレッドの処理に使用されます。 DAC は、スケジューラが専用管理者接続で動作していることを示します。 HOT ADDED は、スケジューラがホット アド CPU イベントに応答して追加されたことを示します。 |
||
is_online |
bit |
SQL Server がサーバー上で利用可能なプロセッサだけを使用するよう構成されている場合、一部のスケジューラが、関係マスクにないプロセッサにマップされている可能性があります。 これに該当する場合、この列には 0 が返されます。 この値は、スケジューラがクエリまたはバッチの処理に使用されていないことを意味します。 NULL 値は許可されません。 |
||
is_idle |
bit |
1 = スケジューラはアイドル状態です。 現在実行中のワーカーはありません。 NULL 値は許可されません。 |
||
preemptive_switches_count |
int |
スケジューラのワーカーがプリエンプティブ モードに切り替えられた回数。 SQL Server 外部のコード (拡張ストアド プロシージャや分散クエリなど) を実行するには、スレッドを非プリエンプティブ スケジューラの制御外で実行する必要があります。 このとき、ワーカーはプリエンプティブ モードに切り替えられます。 |
||
context_switches_count |
int |
スケジューラでコンテキストが切り替えられた回数。 NULL 値は許可されません。 他のワーカーの実行を許可するには、現在実行しているワーカーでスケジューラの制御を解放するか、コンテキストを切り替える必要があります。
|
||
idle_switches_count |
int |
スケジューラがアイドル中にイベントを待機した回数。 この列は context_switches_count と類似しています。 NULL 値は許可されません。 |
||
current_tasks_count |
int |
このスケジューラに関連付けられている現在のタスクの数。 これには次のタスクが含まれます。
タスクが完了すると、このカウントは 1 減ります。 NULL 値は許可されません。 |
||
runnable_tasks_count |
int |
実行可能キューにあるスケジュール待ちのワーカーで、タスクが割り当てられているワーカーの数。 NULL 値は許可されません。 |
||
current_workers_count |
int |
このスケジューラに関連付けられているワーカーの数。 これにはタスクが割り当てられていないワーカーも含まれます。 NULL 値は許可されません。 |
||
active_workers_count |
int |
アクティブなワーカーの数。 アクティブなワーカーがプリエンプティブになることはなく、必ずタスクが関連付けられています。また、実行中、実行可能、または中断状態のいずれかになっています。 NULL 値は許可されません。 |
||
work_queue_count |
bigint |
保留キュー内のタスクの数。 保留キュー内のタスクは、ワーカーによる取得を待機しています。 NULL 値は許可されません。 |
||
pending_disk_io_count |
int |
完了を待機している保留中の I/O の数。 各スケジューラには保留中の I/O の一覧が保持されており、コンテキストが切り替えられるたび、これらの I/O が完了したかどうかを確認するために、この一覧がチェックされます。 要求が挿入されると、カウントは 1 増えます。 要求が完了すると、カウントは 1 減ります。 この数は、I/O の状態を示すわけではありません。 NULL 値は許可されません。 |
||
load_factor |
int |
スケジューラで認識されている負荷を示す内部値。 この値は、新しいタスクをこのスケジューラに指定するか、または他のスケジューラに指定するかを決定するために使用されます。 また、スケジューラの負荷が均等でないと思われる場合のデバッグに利用できます。 ルーティングはスケジューラの負荷に基づいて決定されます。 SQL Server では、ノードとスケジューラの占有率を基に、リソースをどこで取得するかが決定されます。 タスクがエンキューされると、占有率は増加します。 タスクが完了すると、占有率は減少します。 占有率を利用すると、SQL Server OS で負荷を効率よく分散できます。 NULL 値は許可されません。 |
||
yield_count |
int |
スケジューラの進行状況を示すために使用される内部値。 この値は、スケジューラ モニターで、このスケジューラのワーカーが予定どおりに他のワーカーに変更されるかどうかを確認するために使用されます。 ワーカーまたはタスクが新しいワーカーに移行するわけではありません。 NULL 値は許可されません。 |
||
last_timer_activity |
bigint |
前回、スケジューラのタイマー キューがスケジューラにより確認された時間 (CPU ティック単位)。 NULL 値は許可されません。 |
||
failed_to_create_worker |
bit |
スケジューラで新しいワーカーを作成できなかった場合は 1 になります。 これは通常、メモリ制約が原因で発生します。 NULL 値は許可されます。 |
||
active_worker_address |
varbinary(8) |
現在アクティブなワーカーのメモリ アドレス。 NULL 値は許可されます。 詳細については、「sys.dm_os_workers (Transact-SQL)」を参照してください。 |
||
memory_object_address |
varbinary(8) |
スケジューラのメモリ オブジェクトのメモリ アドレス。 NULL 値は許可されません。 |
||
task_memory_object_address |
varbinary(8) |
タスクのメモリ オブジェクトのメモリ アドレス。 NULL 値は許可されません。 詳細については、「sys.dm_os_memory_objects (Transact-SQL)」を参照してください。 |
||
quantum_length_us |
bigint |
単に情報を示すためだけに特定されます。サポートされていません。将来の互換性は保証されません。SQLOS によって使用されるスケジューラ クォンタムを公開します。 |
権限
サーバーに対する VIEW SERVER STATE 権限が必要です。
使用例
A. 非表示スケジューラと表示スケジューラを監視する
次のクエリでは、SQL Server のすべてのスケジューラに関して、ワーカーとタスクの状態が出力されます。 このクエリは、次の要件を満たすコンピューター システムで実行されました。
2 つのプロセッサ (CPU)
2 つの (NUMA) ノード
1 つの NUMA ノードにつき 1 つの CPU
関係マスクが 0x03 に設定されている
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;
以下に結果セットを示します。
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
この出力では次のことがわかります。
スケジューラは 5 つで、 そのうちの 2 つの ID の値は 1048576 未満です。 ID が 1048576 以上のスケジューラは非表示スケジューラです。 スケジューラ 255 は DAC (専用管理者接続) を表します。 インスタンスごとに 1 つの DAC スケジューラが存在します。 メモリの負荷を調整するリソース モニターでは、NUMA ノードごとに 1 つずつ、スケジューラ 257 とスケジューラ 258 が使用されます。
出力では、23 のアクティブなタスクが示されています。 これらのタスクには、SQL Server によって開始されたリソース管理タスクに加えて、ユーザーの要求も含まれています。 SQL Server タスクの例としては、RESOURCE MONITOR (NUMA ノードごとに 1 つ)、LAZY WRITER (NUMA ノードごとに 1 つ)、LOCK MONITOR、CHECKPOINT、LOG WRITER などがあります。
NUMA ノード 0 は CPU 1 にマップされており、NUMA ノード 1 は CPU 0 にマップされています。 SQL Server は通常、ノード 0 以外の NUMA ノードで起動します。
ここでは runnable_tasks_count に 0 が返されており、これはアクティブに実行中のタスクが存在しないことを意味します。 ただし、アクティブなセッションは存在する可能性があります。
DAC を表すスケジューラ 255 には、3 つのワーカーが関連付けられています。 これらのワーカーは SQL Server の起動時に割り当てられ、変更されることはありません。 これらのワーカーは DAC クエリの処理のみに使用されます。 このスケジューラ上の 2 つのタスクは、接続マネージャーとアイドル状態のワーカーを表します。
active_workers_count は、タスクが関連付けられ、非プリエンプティブ モードで実行中のすべてのワーカーを表します。 ネットワーク リスナーなどの一部のタスクは、プリエンプティブなスケジュール設定で実行されます。
非表示スケジューラでは、通常のユーザー要求は処理されません。 ただし、DAC スケジューラは例外です。 この DAC スケジューラには、要求を処理するためのスレッドが 1 つあります。
B. 稼働率が高いシステムで表示スケジューラを監視する
次のクエリでは、負荷が高い表示スケジューラの状態を示します。このスケジューラでは、利用可能なワーカーの処理数を上回る要求が存在します。 この例では、256 のワーカーにタスクが割り当てられており、 一部のタスクはワーカーへの割り当てを待機中です。 実行可能なタスクの数が少ないということは、複数のタスクがリソースの待機中であることを意味します。
注 |
---|
sys.dm_os_workers でクエリを実行すると、ワーカーの状態を確認できます。 詳細については、「sys.dm_os_workers (Transact-SQL)」を参照してください。 |
クエリは次のようになります。
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;
以下に結果セットを示します。
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
これに比較して次の結果では、実行可能なタスクが複数あり、ワーカーの取得を待機中のタスクがないことが示されています。 work_queue_count は両方のスケジューラで 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