sys.dm_os_schedulers (Transact-SQL)

Devuelve una fila por programador en SQL Server donde cada programador está asignado a un determinado procesador. Use esta vista para supervisar la condición de un programador o identificar tareas descontroladas.

Nombre de columna

Tipo de datos

Descripción

scheduler_address

varbinary(8)

Dirección de memoria del programador. No acepta valores NULL.

parent_node_id

int

Identificador del nodo al que pertenece el programador, también denominado nodo primario. Representa un nodo de acceso de memoria no uniforme (NUMA). No acepta valores NULL.

scheduler_id

int

Identificador del programador. Todos los programadores que se utilizan para ejecutar las consultas normales tienen números de identificación inferiores a 1048576. SQL Server usa internamente todos los programadores con identificadores mayores o iguales a 1048576 , como el programador de conexión de administrador dedicado. No acepta valores NULL.

cpu_id

smallint

Identificador de CPU asignado al programador.

No acepta valores NULL.

NotaNota
255 no indican ninguna afinidad como hizo en SQL Server 2005. Para obtener información adicional de la afinidad, vea sys.dm_os_threads (Transact-SQL).

status

nvarchar(60)

Indica el estado del programador. Puede ser uno de los siguientes valores:

  • HIDDEN ONLINE

  • HIDDEN OFFLINE

  • VISIBLE ONLINE

  • VISIBLE OFFLINE

  • VISIBLE ONLINE (DAC)

  • HOT_ADDED

No acepta valores NULL.

Los programadores HIDDEN se utilizan para procesar solicitudes internas de Motor de base de datos. Los programadores VISIBLE se utilizan para procesar solicitudes de usuario.

Los programadores OFFLINE se asignan a procesadores sin conexión en la máscara de afinidad y, por tanto, no se utilizan para procesar solicitudes. Los programadores ONLINE se asignan a procesadores con conexión en la máscara de afinidad y están disponibles para procesar subprocesos.

DAC indica que el programador se está ejecutando con una conexión de administrador dedicada.

HOT ADDED indica los programadores que se agregaron en respuesta a un evento de CPU instalada en cliente.

is_online

bit

Si SQL Server está configurado para usar solo algunos de los procesadores disponibles en el servidor, esta configuración puede significar que algunos programadores están asignados a procesadores que no están en la máscara de afinidad. Si así fuera, esta columna devuelve 0. Este valor indica que el programador no se usa para procesar consultas o lotes.

No acepta valores NULL.

is_idle

bit

1 = El programador está inactivo. No se está ejecutando ningún trabajador. No acepta valores NULL.

preemptive_switches_count

int

Número de veces que los trabajadores de este programador han cambiado al modo preferente.

Para ejecutar código situado fuera de SQL Server (por ejemplo, en procedimientos almacenados extendidos y consultas distribuidas), se tiene que ejecutar un subproceso fuera del control del programador no preferente. Para hacerlo, un trabajador se cambia al modo preferente.

context_switches_count

int

Número de cambios de contexto que se han producido en este programador. No acepta valores NULL.

Para permitir que se ejecuten otros trabajadores, el trabajador en ejecución actual tiene que renunciar al control del programador o el cambio de contexto.

NotaNota
Si un trabajador genera el programador, se incluye a sí mismo en la cola de ejecutables y no encuentra otros trabajadores, se seleccionará a sí mismo. En este caso, el context_switches_count no se actualiza, pero el yield_count sí.

idle_switches_count

int

Número de veces que el programador ha esperado por un evento mientras estaba inactivo. Esta columna es similar a context_switches_count. No acepta valores NULL.

current_tasks_count

int

Número de tareas actuales que están asociadas a este programador. Este recuento incluye lo siguiente:

  • Tareas que esperan a que un trabajador las ejecute.

  • Tareas actualmente en espera o en ejecución (en estado SUSPENDED o RUNNABLE).

Cuando una tarea se completa, este contador disminuye. No acepta valores NULL.

runnable_tasks_count

int

Número de trabajadores, con tareas asignadas, que están esperando a ser programados en la cola de ejecutables. No acepta valores NULL.

current_workers_count

int

Número de trabajadores que están asociados a este programador. Este recuento incluye a los trabajadores que no están asignados a ninguna tarea. No acepta valores NULL.

active_workers_count

int

Número de trabajadores activos. Un trabajador activo nunca es preferente, debe tener una tarea asociada y está ejecutándose, es ejecutable o está suspendido. No acepta valores NULL.

work_queue_count

bigint

Número de tareas en la cola de tareas pendientes. Estas tareas esperan a que un trabajador las ejecute. No acepta valores NULL.

pending_disk_io_count

int

Número de E/S pendientes que esperan a completarse. Cada programador tiene una lista de E/S pendientes que se comprueban para determinar si se han completado cada vez que hay un cambio de contexto. El recuento aumenta cuando se inserta la solicitud. Este recuento disminuye cuando la solicitud se completa. Este número no indica el estado de las operaciones de E/S. No acepta valores NULL.

load_factor

int

Valor interno que indica la carga detectada en este programador. Este valor se usa para determinar si una nueva tarea debe colocarse es este programador o en otro. Este valor es útil para tareas de depuración cuando parece que los programadores no están cargados equitativamente. En SQL Server 2000, una tarea se enruta a un programador determinado. No obstante, en SQL Server, la decisión de enrutado se realiza basándose en la carga en el programador. SQL Server también usa un factor de carga de nodos y programadores para ayudar a determinar la mejor ubicación para adquirir recursos. Cuando una tarea se pone en cola, el factor de carga aumenta. Cuando una tarea se completa, el factor de carga disminuye. El uso de los factores de carga ayuda a que el SO de SQL Server equilibre mejor la carga de trabajo. No acepta valores NULL.

yield_count

int

Valor interno que se usa para indicar el progreso en este programador. El monitor de programadores usa este valor para determinar si un trabajador del programador no está generando otros trabajadores a tiempo. Este valor no indica que el trabajador o la tarea se transfirieron a un nuevo trabajador. No acepta valores NULL.

last_timer_activity

bigint

En pulsos de CPU, la última vez que el programador comprobó la cola del temporizador del programador. No acepta valores NULL.

failed_to_create_worker

bit

Se establece en 1 si no se pudo crear un trabajador en este programador. Generalmente se produce debido a restricciones de memoria. Acepta valores NULL.

active_worker_address

varbinary(8)

Dirección de memoria del trabajador que está activo actualmente. Acepta valores NULL. Para obtener más información, vea sys.dm_os_workers (Transact-SQL).

memory_object_address

varbinary(8)

Dirección de memoria del objeto de memoria del programador. No acepta valores NULL.

task_memory_object_address

varbinary(8)

Dirección de memoria del objeto de memoria de la tarea. No acepta valores NULL. Para obtener más información, vea sys.dm_os_memory_objects (Transact-SQL).

quantum_length_us

bigint

Solamente se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada. Expone el cuanto del programador que usa SQLOS.

Permissions

Requiere el permiso VIEW SERVER STATE en el servidor.

Ejemplos

A. Supervisar programadores ocultos y no ocultos

En la siguiente consulta se muestra el estado de los trabajadores y las tareas en todos los programadores de SQL Server. Esta consulta se ejecutó en un sistema que incluye lo siguiente:

  • Dos procesadores (CPU)

  • Dos nodos (NUMA)

  • Una CPU por nodo NUMA

  • Máscara de afinidad establecida en 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;

El conjunto de resultados es el siguiente.

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

La salida proporciona la siguiente información:

  • Existen cinco programadores. Dos programadores tienen un valor de identificador < 1048576. Los programadores con un identificador >= 1048576 se denominan programadores ocultos. El programador 255 representa la conexión de administrador dedicada (DAC). Existe un programador DAC por sesión. Los monitores de recursos que coordinan la presión de la memoria utilizan los programadores 257 y 258, uno por nodo NUMA.

  • La salida muestra 23 tareas activas. Estas tareas incluyen solicitudes de usuario además de las tareas de administración de recursos iniciadas por SQL Server. Ejemplos de tareas de SQL Server son RESOURCE MONITOR (una por nodo NUMA), LAZY WRITER (una por nodo NUMA), LOCK MONITOR, CHECKPOINT y LOG WRITER.

  • El nodo NUMA 0 se asigna a la CPU 1 y el nodo NUMA 1 se asigna a la CPU 0. Generalmente, SQL Server se inicia en un nodo NUMA distinto del nodo 0. Para obtener más información, vea Descripción del acceso no uniforme a memoria.

  • Si runnable_tasks_count devuelve 0, indica que no existen tareas activas en ejecución. Sin embargo, pueden existir sesiones activas.

  • El programador 255 que representa la conexión DAC incluye 3 trabajadores asociados. Estos trabajadores se asignan en el inicio de SQL Server y no cambian. Se utilizan únicamente para procesar consultas DAC. Las dos tareas de este programador representan un administrador de conexiones y un trabajador inactivo.

  • active_workers_count representa a todos los trabajadores con tareas asociadas que se ejecutan en modo no preferente. Algunas tareas, como las escuchas de red, se ejecutan con programas preferentes.

  • Los programadores ocultos no procesan solicitudes habituales de usuario. El programador DAC es la excepción. Este programador dispone de un subproceso para ejecutar solicitudes.

B. Supervisar programadores no ocultos en un sistema ocupado

En la consulta siguiente se muestra el estado de programadores no ocultos con mucha carga en los que existen más solicitudes de las que pueden controlar los trabajadores disponibles. En este ejemplo tienen asignadas tareas 256 trabajadores. Algunas tareas están esperando su asignación a un trabajador. El recuento bajo de ejecutables implica que varias tareas están esperando un recurso.

Nota

Puede conocer el estado de los trabajadores si consulta sys.dm_os_workers. Para obtener más información, vea sys.dm_os_workers (Transact-SQL).

Esta es la consulta:

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;

El conjunto de resultados es el siguiente.

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

Por comparación, el resultado siguiente muestra varias tareas ejecutables donde ninguna tarea está esperando para obtener un trabajador. El valor de work_queue_count es 0 en ambos programadores.

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