sys.dm_os_schedulers (Transact-SQL)

SQL Server のスケジューラごとに 1 行のデータを返します。SQL Server では、各スケジューラは個別のプロセッサにマップされています。このビューは、スケジューラの状況の監視やランナウェイ タスクの特定に使用できます。

列名

データ型

説明

scheduler_address

varbinary(8)

スケジューラのメモリ アドレス。NULL 値は許可されません。

parent_node_id

int

スケジューラが属するノード (親ノード) の ID。これは NUMA (nonuniform memory access) ノードを表します。NULL 値は許可されません。

scheduler_id

int

スケジューラの ID。定期的なクエリの実行に使用されるスケジューラにはすべて、1048576 未満の ID 番号が付いています。ID が 1048576 以上のスケジューラは、専用管理者接続のスケジューラなど、SQL Server 内部で使用されるスケジューラです。NULL 値は許可されません。

cpu_id

smallint

スケジューラに割り当てられた CPU ID。

NULL 値は許可されません。

注意
SQL Server 2005 の場合と異なり、255 を指定しても "関係がない" という意味にはなりません。関係の詳細については、「sys.dm_os_threads (Transact-SQL)」を参照してください。

status

nvarchar(60)

スケジューラの状態。次の値のいずれかです。

  • HIDDEN ONLINE

  • HIDDEN OFFLINE

  • VISIBLE ONLINE

  • VISIBLE OFFLINE

  • VISIBLE ONLINE (DAC)

  • HOT_ADDED

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 値は許可されません。

他のワーカーの実行を許可するには、現在実行しているワーカーでスケジューラの制御を解放するか、コンテキストを切り替える必要があります。

注意
ワーカーでスケジューラが解放され、そのワーカーが実行可能キューに移動した後、他のワーカーが見つからない場合は、元のワーカーが選択されます。この場合、context_switches_count は更新されませんが、yield_count は更新されます。

idle_switches_count

int

スケジューラがアイドル中にイベントを待機した回数。この列は context_switches_count と類似しています。NULL 値は許可されません。

current_tasks_count

int

このスケジューラに関連付けられている現在のタスクの数。これには次のタスクが含まれます。

  • 実行ワーカーを待機しているタスク

  • 現在待機中または実行中のタスク (SUSPENDED または RUNNABLE 状態)

タスクが完了すると、このカウントは 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 2000 では、タスクは特定のスケジューラにルーティングされます。一方、SQL Server では、ルーティングはスケジューラの負荷に基づいて決定されます。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 の値は 255 未満です。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 ノードで起動します。詳細については、「Non-Uniform Memory Access について」を参照してください。

  • ここでは 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