sys.dm_os_schedulers (Transact-SQL)

Возвращает по одной строке для каждого планировщика в SQL Server, в которой с каждым планировщиком сопоставляется отдельный процессор. Используйте это представление для мониторинга состояния планировщика или для определения отклонившихся от расписания задач.

Имя столбца

Тип данных

Описание

scheduler_address

varbinary(8)

Адрес памяти планировщика. Не допускает значение NULL.

parent_node_id

int

Идентификатор узла, к которому относится планировщик; этот узел еще называют родительским. Он является узлом с неоднородным доступом к памяти (NUMA). Не допускает значение NULL.

scheduler_id

int

Идентификатор планировщика. Все планировщики, используемые для выполнения обычных запросов, имеют идентификаторы меньше 1048576. Планировщики с идентификаторами, равными или большими 1048576, используются внутренними механизмами SQL Server, например планировщиком выделенных административных соединений. Не допускает значения NULL.

cpu_id

smallint

Идентификатор ЦП, назначенного планировщику.

Не допускает значения NULL.

ПримечаниеПримечание
255 не указывает на привязку, как в SQL Server 2005. Дополнительные сведения о привязках см. в разделе sys.dm_os_threads (Transact-SQL).

status

nvarchar(60)

Указывает состояние планировщика. Может принимать одно из следующих значений:

  • HIDDEN ONLINE

  • HIDDEN OFFLINE

  • VISIBLE ONLINE

  • VISIBLE OFFLINE

  • VISIBLE ONLINE (DAC)

  • HOT_ADDED

Не допускает значения NULL.

Планировщики с состоянием HIDDEN используются для обработки внутренних запросов компонента Database Engine. Планировщики с состоянием VISIBLE — для обработки пользовательских запросов.

Планировщики с состоянием OFFLINE соответствуют процессорам, находящимся в маске схожести в режиме вне сети и поэтому не используемым для обработки запросов. Планировщики с состоянием ONLINE соответствуют процессорам, находящимся в маске схожести в режиме в сети и поэтому доступным для обработки потоков.

Состояние DAC указывает на то, что планировщик выполняется через выделенное административное соединение.

Состояние HOT ADDED указывает, что планировщики были добавлены в ответ на событие ЦП с поддержкой горячей замены.

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

Число операций ввода-вывода, ожидающих завершения. Каждый планировщик имеет список незавершенных операций ввода-вывода, проверяя при каждом переключении контекста, не завершены ли они. Этот счетчик увеличивается при поступлении запроса и уменьшается при завершении обработки запроса. Он не характеризует состояние операций ввода-вывода. Не допускает значение NULL.

load_factor

int

Внутреннее значение, характеризующее нагрузку на планировщик. Оно используется для распределения задач между планировщиками. Это значение может оказаться полезным при отладке в случае неравномерного распределения нагрузки между планировщиками. В SQL Server 2000 задача направлялась конкретному планировщику. Однако в SQL Server решение о назначении задачи тому или иному планировщику принимается на основе загрузки планировщика. Кроме того, для определения наилучшего источника ресурсов в SQL Server используется фактор нагрузки на узлы и планировщики. Когда задача помещается в очередь, фактор нагрузки увеличивается. Когда задача завершается, фактор нагрузки уменьшается. Факторы нагрузки помогают операционной системе SQL Server эффективнее выполнять балансировку нагрузки. Не допускает значение NULL.

yield_count

int

Внутреннее значение, характеризующее ход выполнения работы на данном планировщике. Это значение используется монитором планировщиков для определения того, вовремя ли исполнитель уступает право на выполнение другим исполнителям. Оно не свидетельствует о передаче управления новому исполнителю. Не допускает значение NULL.

last_timer_activity

bigint

Время последней проверки очереди таймера планировщиком (в тактах ЦП). Не допускает значение 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.

quantum_length_us

bigint

Указано только в ознакомительных целях. Не поддерживается. Совместимость с будущими версиями не гарантируется. Отображает такт планировщика, используемый SQLOS.

Разрешения

Требует разрешения VIEW SERVER STATE на сервере.

Примеры

А. Наблюдение за скрытыми и видимыми планировщиками

Следующий запрос выводит состояние исполнителей и задач в SQL Server по всем планировщикам. Этот запрос был выполнен на компьютере со следующей конфигурацией:

  • два процессора (ЦП)

  • два узла NUMA

  • один ЦП на узел NUMA

  • маска схожести 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), LAZY WRITER (одна на каждый узел NUMA), LOCK MONITOR, CHECKPOINT и LOG WRITER.

  • Узел NUMA с идентификатором 0 сопоставлен с ЦП 1, а узел с идентификатором 1 — с ЦП 0. SQL Server обычно запускается на узле NUMA, отличном от 0. Дополнительные сведения см. в разделе Основные сведения о неоднородном доступе к памяти.

  • При значении runnable_tasks_count, равном 0, активные выполняемые задачи отсутствуют. Однако могут присутствовать активные сеансы.

  • С планировщиком 255, представляющим выделенное административное соединение (DAC), связано 3 исполнителя. Эти исполнители выделяются при запуске SQL Server и не изменяются. Они используются только для обработки запросов выделенного административного соединения (DAC) . Две задачи этого планировщика представляют собой диспетчер соединений и простаивающий исполнитель.

  • Значение active_workers_count представляет все исполнители, с которыми связаны задачи, и которые выполняются в режиме без вытеснения. Некоторые задачи, например средства прослушивания сети, запускаются планировщиком в режиме с вытеснением.

  • Скрытые планировщики не обрабатывают стандартные запросы пользователей. Исключением является планировщик выделенного административного соединения (DAC). Этот планировщик имеет один поток для обработки запросов.

Б. Наблюдение за видимыми планировщиками в загруженной системе

Следующий запрос демонстрирует состояние чрезмерно загруженных видимых планировщиков, при котором имеется больше запросов, чем могут обработать доступные исполнители. В данном примере задачи назначены 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