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.
Nota
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:
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.
Nota
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:
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