sys.dm_os_schedulers (Transact-SQL)
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、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
は CPU1
にマップされており、NUMA ノード1
は CPU0
にマップされています。 SQL Server は通常、ノード 0 以外の NUMA ノードで起動します。ここでは
runnable_tasks_count
に0
が返されており、これはアクティブに実行中のタスクが存在しないことを意味します。 ただし、アクティブなセッションが存在する可能性があります。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