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 平台系统(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。 用来运行定期查询的所有计划程序都有小于 1048576 的 ID 号。 SQL Server 在内部使用 ID 大于或等于1048576的计划程序,例如专用管理员连接计划程序。 不可为 null。
cpu_id smallint 分配给计划程序的 CPU ID。

不可为 null。

注意: 255 不指示与 SQL Server 2005(9.x)中的关联一样。 有关其他相关性信息,请参阅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 状态)。

完成任务时,此计数将减少。 不可为 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 标识为仅供参考。 不支持。 不保证以后的兼容性。 指示基于 服务级别目标的限制,对于非 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 托管实例,需要 VIEW SERVER STATE 权限。

在 SQL 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Microsoft Entra 管理员帐户或 ##MS_ServerStateReader## 服务器角色中的成员身份为必填项。 对于所有其他 SQL 数据库服务目标,需要数据库的 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  

输出提供下列信息:

  • 有五个计划程序。 两个计划程序具有 ID 值 < 1048576。 ID >为 = 1048576 的计划程序称为隐藏计划程序。 计划程序 255 代表专用管理员连接 (DAC)。 每个实例都有一个 DAC 计划程序。 协调内存压力的资源监视器为两个 NUMA 节点分别使用计划程序 257 和计划程序 258

  • 输出中有 23 个当前任务。 除了 SQL Server 启动的资源管理任务外,这些任务还包括用户请求。 SQL Server 任务的示例包括 RESOURCE MONITOR(每个 NUMA 节点一个)、延迟编写器(每个 NUMA 节点一个)、锁监视器、检查点和日志编写器。

  • NUMA 节点 0 映射到 CPU 1,NUMA 节点 1 映射到 CPU 0。 SQL Server 通常在节点 0 以外的 NUMA 节点上启动。

  • runnable_tasks_count 返回 0 时,表示没有正在运行的当前任务。 但是,可能存在活动会话。

  • 计划程序 255 表示 DAC 有 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)