sys.dm_os_schedulers (Transact-SQL)

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

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

注意

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

- HIDDEN ONLINE
- 非表示オフライン
- 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 アクティブなワーカーの数。 アクティブな worker は決して優先されません。関連付けられたタスクを持っている必要があり、実行中、実行可能、または中断されています。 NULL 値は許可されません。
work_queue_count bigint 保留中のキュー内のタスクの数。 保留キュー内のタスクは、ワーカーによる取得を待機しています。 NULL 値は許可されません。
pending_disk_io_count int 完了を待機している保留中の I/O の数。 各スケジューラには、保留中の I/O の一覧が表示され、コンテキスト 切り替えがあるたびに完了したかどうかを確認します。 要求が挿入されると、カウントがインクリメントされます。 要求が完了すると、カウントは 1 減ります。 この数は、I/O の状態を示すわけではありません。 NULL 値は許可されません。
load_factor int このスケジューラに対して認識される負荷を示す内部値。 この値は、このスケジューラまたは別のスケジューラに新しいタスクを配置する必要があるかどうかを判断するために使用されます。 この値は、スケジューラが均等に読み込まれていないように見える場合にデバッグ目的で役立ちます。 ルーティングの決定は、スケジューラの負荷に基づいて行われます。 SQL Serverでは、ノードとスケジューラの読み込み係数を使用して、リソースを取得するための最適な場所を決定することもできます。 タスクがエンキューされると、負荷係数が増加します。 タスクが完了すると、占有率は減少します。 負荷要因を使用すると、OS SQL Server作業負荷のバランスを取るのに役立ちます。 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) 以降

1 人のワーカーが切り替え、もう 1 つのワーカーが切り替わるまでの時間。 プリエンプティブ ワーカーが次の非割り込みワーカーのスケジュール設定を遅らせたり、他のプロセスからの 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 BasicS0、および S1 のサービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、Azure Active Directory 管理者アカウント、または ##MS_ServerStateReader##サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。

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 つのスケジューラには ID 値 < が1048576。 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 人のワーカーにタスクが割り当てられます。 一部のタスクはワーカーへの割り当てを待機中です。 実行できる数が少ないほど、複数のタスクが 1 つのリソースを待機していることを意味します。

注意

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)