分享方式:


sys.dm_os_schedulers (Transact-SQL)

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

針對 SQL Server 中的每個排程器,各傳回一個資料列,其中每個排程器都會對應至個別的處理器。 請利用這份檢視來監視排程器的狀況或識別失控的工作。 如需排程器的詳細資訊,請參閱 線程和工作架構指南

注意

若要從 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 排程器所屬節點的標識碼,也稱為父節點。 這表示非一元記憶體存取 (NUMA) 節點。 不可為 Null。
scheduler_id int 排程器的標識碼。 用來執行一般查詢的所有排程器標識碼都小於 1048576。 SQL Server 會在內部使用標識碼大於或等於1048576的排程器,例如專用的系統管理員聯機排程器。 不可為 Null。
cpu_id smallint 指派給排程器的CPU標識碼。

不可為 Null。

注意: 255 不會指出 SQL Server 2005 (9.x) 中沒有相似性。 如需其他親和性資訊,請參閱sys.dm_os_threads (Transact-SQL)。
status nvarchar(60) 指出排程器的狀態。 可以是下列值之一:

- HIDDEN ONLINE
- 隱藏離線
- 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 狀態)。

當工作完成時,此計數會遞減。 不可為 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 的狀態。 不可為 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 僅供參考之用。 不支援。 我們無法保證未來的相容性。 表示根據 服務等級目標進行節流,SQL Server 的非 Azure 版本一律為 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 受控執行個體上,需要 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 中的背景工作和工作狀態。 此查詢是在具有下列項目的電腦系統上執行:

  • 兩個處理器 (CPU)

  • 兩個 (NUMA) 節點

  • 每個 NUMA 節點一個 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  

輸出提供下列資訊:

  • 有五個排程器。 兩個排程器具有標識碼值 < 1048576。 識別子 >為 = 1048576的排程器稱為隱藏排程器。 排程器 255 代表專用的系統管理員連接(DAC)。 每個實例都有一個 DAC 排程器。 協調記憶體壓力的資源監視器會使用排程器和 257 排程器 258,每個NUMA節點一個

  • 輸出中有23個作用中工作。 除了 SQL Server 所啟動的資源管理工作之外,這些工作還包括使用者要求。 SQL Server 工作的範例包括 RESOURCE MONITOR(每個 NUMA 節點一個)、延遲寫入器(每個 NUMA 節點一個)、LOCK MONITOR、CHECKPOINT 和 LOG WRITER。

  • NUMA 節點 0 會對應至 CPU 1 ,而 NUMA 節點 1 會對應至 CPU 0。 SQL Server 通常會在節點 0 以外的 NUMA 節點上啟動。

  • 傳回 0runnable_tasks_count,沒有主動執行的工作。 不過,使用中的會話可能已經存在。

  • 代表 DAC 的排程器 255 具有 3 與其相關聯的背景工作角色。 這些背景工作角色會在 SQL Server 啟動時配置,且不會變更。 這些背景工作角色只會用來處理 DAC 查詢。 此排程器的兩項工作代表連接管理員和閑置的背景工作。

  • active_workers_count 代表具有相關聯工作且在非先占模式下執行的所有背景工作。 某些工作,例如網路接聽程式,會在先佔式排程下執行。

  • 隱藏排程器不會處理一般使用者要求。 DAC 排程器是例外狀況。 此 DAC 排程器有一個線程來處理要求。

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  

另請參閱

SQL Server 操作系統相關動態管理檢視 (Transact-SQL)