sys.dm_os_schedulers (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQL Server のスケジューラごとに 1 行のデータを返します。各スケジューラは個別のプロセッサにマップされています。 このビューは、スケジューラの状況の監視やランナウェイ タスクの特定に使用できます。 スケジューラの詳細については、「スレッドとタスクの アーキテクチャ ガイド」を参照してください。

Note

これを Azure Synapse Analytics または Analytics Platform System (PDW) から呼び出すには、sys.dm_pdw_nodes_os_schedulersという名前を使用します。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

列名 データ型 説明
scheduler_address varbinary(8) スケジューラのメモリ アドレス。 NULL 値は許可されません。
parent_node_id int スケジューラが属するノードの ID (親ノードとも呼ばれます)。 これは非均質メモリ アクセス (NUMA) ノードを表します。 NULL 値は許可されません。
scheduler_id int スケジューラの ID。 通常のクエリの実行に使用されるすべてのスケジューラの ID 番号は、1048576未満です。 1048576以上の ID を持つスケジューラは、専用の管理者接続スケジューラなど、SQL Server によって内部的に使用されます。 NULL 値は許可されません。
cpu_id smallint スケジューラに割り当てられた CPU ID。

NULL 値は許可されません。

注: 255 は、SQL Server 2005 (9.x) と同じようにアフィニティがないことを示していません。 その他のアフィニティ情報については、「 sys.dm_os_threads (Transact-SQL)」 を参照してください。
status nvarchar(60) スケジューラの状態。 値は、次のいずれかです。

- 非表示のオンライン
- オフライン非表示
- VISIBLE ONLINE
- オフラインで表示
- 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 このスケジューラに関連付けられているワーカーの数。 この数には、タスクが割り当てられない worker が含まれます。 NULL 値は許可されません。
active_workers_count int アクティブなワーカーの数。 アクティブなワーカーは、割り込むことはなく、関連付けられたタスクを持つ必要があり、実行中、実行可能、または中断されています。 NULL 値は許可されません。
work_queue_count bigint 保留中のキュー内のタスクの数。 保留キュー内のタスクは、ワーカーによる取得を待機しています。 NULL 値は許可されません。
pending_disk_io_count int 完了を待機している保留中の I/O の数。 各スケジューラには、コンテキスト切り替えのたびに完了したかどうかを判断するためにチェックされる保留中の I/O の一覧があります。 要求が挿入されると、カウントがインクリメントされます。 要求が完了すると、カウントは 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 で使用されるスケジューラ量子を公開します。
total_cpu_usage_ms bigint 適用対象: SQL Server 2016 (13.x) 以降

非割り込みワーカーによって報告された、このスケジューラによって消費された CPU の合計。 NULL 値は許可されません。
total_cpu_idle_capped_ms bigint 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 サービス レベル目標に基づく調整を示します。Azure 以外のバージョンの SQL Server では常に 0 になります。 NULL 値が許可されます。
total_scheduler_delay_ms bigint 適用対象: SQL Server 2016 (13.x) 以降

あるワーカーの切り替えと別のワーカーの切り替えの間の時間。 割り込みワーカーが次の非割り込みワーカーのスケジュール設定を遅らせたり、他のプロセスからの OS スケジュール スレッドが原因で発生する可能性があります。 NULL 値は許可されません。
ideal_workers_limit int 適用対象: SQL Server 2019 (15.x) 以降

スケジューラに理想的に必要なワーカーの数。 現在のワーカーがタスクの負荷の不均衡のために制限を超えた場合、アイドルになるとトリミングされます。 NULL 値は許可されません。
pdw_node_id int 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW)

このディストリビューションがオンになっているノードの識別子。

アクセス許可

SQL Server と SQL Managed Instance では、VIEW SERVER STATE アクセス許可が必要です。

SQL Database Basic、S0、S1 サービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、またはサーバー ロール##MS_ServerStateReader##メンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。

SQL Server 2022 以降でのアクセス許可

サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。

A. 非表示スケジューラと非ハイデン スケジューラの監視

次のクエリは、すべてのスケジューラにわたって SQL Server のワーカーとタスクの状態を出力します。 このクエリは、次のコンピューター システムで実行されました。

  • 2 つのプロセッサ (CPU)

  • 2 つの (NUMA) ノード

  • 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 つのスケジューラには、1048576 ID 値 < があります。 ID >= 1048576を持つスケジューラは、非表示スケジューラと呼ばれます。 Scheduler は 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_count0 が返されており、これはアクティブに実行中のタスクが存在しないことを意味します。 ただし、アクティブなセッションが存在する可能性があります。

  • DAC を表すスケジューラ 255 には、 3 ワーカーが関連付けられています。 これらのワーカーは SQL Server の起動時に割り当てられ、変更されません。 これらのワーカーは、DAC クエリの処理にのみ使用されます。 このスケジューラの 2 つのタスクは、接続マネージャーとアイドル状態のワーカーを表します。

  • active_workers_count は、関連付けられたタスクを持ち、非優先モードで実行されているすべてのワーカーを表します。 ネットワーク リスナーなどの一部のタスクは、プリエンプティブ スケジューリングの下で実行されます。

  • 非表示のスケジューラは、一般的なユーザー要求を処理しません。 ただし、DAC スケジューラは例外です。 この DAC スケジューラには、要求を処理するためのスレッドが 1 つあります。

B. ビジー状態のシステムでの非ハイデン スケジューラの監視

次のクエリでは、負荷が高い表示スケジューラの状態を示します。このスケジューラでは、利用可能なワーカーの処理数を上回る要求が存在します。 この例では、256 人のワーカーにタスクが割り当てられます。 一部のタスクはワーカーへの割り当てを待機中です。 実行可能な数が少ないほど、複数のタスクがリソースを待機していることを意味します。

Note

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  

関連項目

SQL Server オペレーティングシステム関連の動的管理ビュー (Transact-sql)