sys.dm_os_schedulers (Transact-SQL)
Retorna uma linha por agendador no SQL Server, onde cada agendador é mapeado para um processador individual. Use esta exibição para monitorar a condição de um agendador ou para identificar tarefas sem controle.
Nome da coluna |
Tipo de dados |
Descrição |
---|---|---|
scheduler_address |
varbinary(8) |
Endereço de memória do agendador. Não permite valor nulo. |
parent_node_id |
int |
ID do nó ao qual o agendador pertence, também conhecido como nó pai. Isso representa um nó NUMA (acesso não uniforme à memória). Não permite valor nulo. |
scheduler_id |
int |
ID do agendador. Todos os agendadores que são usados para executar consultas regulares têm números de ID menores que 255. Os agendadores que tiverem IDs maiores ou iguais a 255 serão usados internamente pelo SQL Server, como o agendador dedicado de conexões do administrador. Não permite valor nulo. |
cpu_id |
smallint |
ID da CPU à qual o agendador está associado. Se o SQL Server estiver configurado para ser executado com afinidade, o valor será a ID da CPU na qual o agendador é supostamente executado. 255 = a máscara de afinidade não está especificada. Não permite valor nulo. |
status |
nvarchar(60) |
Indica o status do agendador. Pode ser um dos seguintes valores:
Não permite valor nulo. Os agendadores HIDDEN são usados para processar solicitações internas do Mecanismo de Banco de Dados. Os agendadores VISIBLE são usados para processar solicitações de usuários. Os agendadores OFFLINE são mapeados para processadores que estão offline na máscara de afinidade e, portanto, não estão sendo usados para processar solicitações. Os agendadores ONLINE são mapeados para processadores que estão online na máscara de afinidade e estão disponíveis para processar threads. DAC indica que o agendador está sendo executado em uma conexão de administrador dedicada. HOT ADDED indica que os agendadores foram adicionados em resposta a um evento de inclusão de CPU a quente. |
is_online |
bit |
Se o SQL Server estiver configurado para usar somente alguns dos processadores disponíveis no servidor, essa configuração pode indicar que alguns agendadores estão mapeados para processadores que não estão na máscara de afinidade. Se esse for o caso, essa coluna retornará 0. Esse valor indica que o agendador não está sendo usado para processar consultas ou lotes. Não permite valor nulo. |
is_idle |
bit |
1 = O agendador está inativo. Nenhum trabalhador está em execução no momento. Não permite valor nulo. |
preemptive_switches_count |
int |
Número de vezes que os trabalhadores neste agendador alternaram para o modo preemptivo. Para executar código fora do SQL Server (por exemplo, procedimentos armazenados estendidos e consultas distribuídas), um thread deve ser executado fora do controle do agendador não preemptivo. Para isso, um trabalhador alterna para o modo preemptivo. |
context_switches_count |
int |
Número de alternâncias de contexto que ocorreram neste agendador. Não permite valor nulo. Para permitir que outros trabalhadores sejam executados, o trabalhador em execução no momento precisa abrir mão do controle do agendador ou alternar o contexto.
Observação
Se um trabalhador ceder o agendador, colocar-se na fila executável e não encontrar outros trabalhadores, ele selecionará a si mesmo. Neste caso, a context_switches_count não será atualizada, mas a yield_count será.
|
idle_switches_count |
int |
Número de horas que o agendador espera por um evento enquanto está inativo. Esta coluna é semelhante à context_switches_count. Não permite valor nulo. |
current_tasks_count |
int |
Número de tarefas atualmente associadas a este agendador. Esta contagem inclui o seguinte:
Quando uma tarefa é concluída, esta contagem é reduzida. Não permite valor nulo. |
runnable_tasks_count |
int |
Número de trabalhadores, com tarefas atribuídas a eles, que esperam para serem agendados na fila executável. Não permite valor nulo. |
current_workers_count |
int |
Número de trabalhadores associados a este agendador. Esta contagem inclui trabalhadores que não estão atribuídos a nenhuma tarefa. Não permite valor nulo. |
active_workers_count |
int |
Número de trabalhadores que estão ativos. Um trabalhador ativo nunca é preemptivo, deve ter uma tarefa associada e estar em execução, ser executável ou estar suspenso. Não permite valor nulo. |
work_queue_count |
bigint |
Número de tarefas na fila pendente. Essas tarefas estão aguardando um trabalhador que as selecione. Não permite valor nulo. |
pending_disk_io_count |
int |
Número de E/Ss pendentes que aguardam para serem concluídas. Cada agendador possui uma lista de E/Ss pendentes que são verificadas para determinar se foram concluídas sempre que há uma alternância de contexto. A contagem aumenta quando a solicitação é inserida. Essa contagem diminui quando a solicitação é concluída. O número não indica o estado das E/Ss. Não permite valor nulo. |
load_factor |
int |
Valor interno que indica a carga percebida neste agendador. Esse valor é usado para determinar se uma nova tarefa deve ser colocada neste ou em outro agendador. O valor é útil para fins de depuração, quando parece que os agendadores não são carregados de maneira uniforme. No SQL Server 2000, uma tarefa é roteada para um agendador em particular. Entretanto, no SQL Server, a decisão de roteamento é tomada com base na carga do agendador. O SQL Server também utiliza um fator de carga de nós e agendadores para ajudar a determinar o melhor local para adquirir recursos. Quando uma tarefa é enfileirada, o fator de carga aumenta. Quando uma tarefa é concluída, o fator de carga diminui. O uso do fator de carga ajuda o SO do SQL Server a equilibrar melhor a carga de trabalho. Não permite valor nulo. |
yield_count |
int |
Valor interno que é usado para indicar o progresso neste agendador. Esse valor é usado pelo Scheduler Monitor para determinar se um trabalhador no agendador não está cedendo a outros trabalhadores no momento. O valor não indica que houve transição do trabalhador ou da tarefa para um novo trabalhador. Não permite valor nulo. |
last_timer_activity |
bigint |
Em marcações de CPU, a última vez que a fila do temporizador do agendador foi verificada pelo agendador. Não permite valor nulo. |
failed_to_create_worker |
bit |
Definido como 1 se não foi possível criar um novo trabalhador neste agendador. Isso geralmente ocorre devido a restrições de memória. Permite valor nulo. |
active_worker_address |
varbinary(8) |
Endereço de memória do trabalhador que está ativo no momento. Permite valor nulo. Para obter mais informações, consulte sys.dm_os_workers (Transact-SQL). |
memory_object_address |
varbinary(8) |
Endereço de memória do objeto de memória do agendador. Não permite o valor NULL. |
task_memory_object_address |
varbinary(8) |
Endereço de memória do objeto de memória da tarefa. Não permite valor nulo. Para obter mais informações, consulte sys.dm_os_memory_objects (Transact-SQL). |
Permissões
Requer a permissão VIEW SERVER STATE no servidor.
Exemplos
A. Monitorando agendadores ocultos e não ocultos
A consulta a seguir retorna o estado de trabalhadores e tarefas no SQL Server em todos os agendadores. Essa consulta foi executada em um sistema de computador que tem o seguinte:
Dois processadores (CPUs)
Dois nós (NUMA)
Uma CPU por nó NUMA
Máscara de afinidade definida como 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;
Conjunto de resultados.
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
A saída fornece as seguintes informações:
Há cinco agendamentos. Dois agendadores têm um valor de ID < 255. Agendadores com ID >= 255 são conhecidos como agendadores ocultos. O agendador 255 representa a conexão de administrador dedicada (DAC). Há um agendador DAC para cada instância. Monitores de recursos que coordenam a pressão de memória utilizam o agendador 257 e o agendador 258, um para cada nó NUMA
Há 23 tarefas ativas na saída. Essas tarefas incluem solicitações de usuários, bem como tarefas de gerenciamento de recursos que foram iniciadas pelo SQL Server. Exemplos de tarefas do SQL Server são: RESOURCE MONITOR (uma para cada nó NUMA), LAZY WRITER (uma para cada nó NUMA), LOCK MONITOR, CHECKPOINT e LOG WRITER.
O nó NUMA 0 é mapeado para a CPU 1 e o nó NUMA 1 é mapeado para a CPU 0. Em geral, o SQL Server inicia em um nó NUMA que não seja o nó 0. Para obter mais informações, consulte Compreendendo o Non-uniform Memory Access.
Com runnable_tasks_count retornando 0, não há nenhuma tarefa ativamente em execução. Entretanto, pode haver sessões ativas.
O agendador 255 representando DAC possui 3 trabalhadores associados. Esses trabalhadores são alocados na inicialização do SQL Server e não são alterados. Esses trabalhadores são usados para processar somente consultas DAC. As duas tarefas neste agendador representam um gerenciador de conexões e um trabalhador inativo.
active_workers_count representa todos os trabalhadores que possuem tarefas associadas e são executados no modo não preemptivo. Algumas tarefas, como escutas de rede, são executadas sob planejamento preemptivo.
Agendadores ocultos não processam solicitações comuns de usuário. O agendador DAC é a exceção. Ele possui um thread para processar solicitações.
B. Monitorando agendadores não ocultos em um sistema ocupado
A consulta a seguir mostra o estado de agendadores não ocultos intensamente carregados, onde há mais solicitações do que os trabalhadores disponíveis podem manipular. Neste exemplo, 256 trabalhadores recebem tarefas. Algumas tarefas estão aguardando a atribuição a um trabalhador. A contagem de executáveis mais baixa indica que várias tarefas aguardam um recurso.
Observação |
---|
Você pode descobrir o estado de trabalhadores consultando sys.dm_os_workers. Para obter mais informações, consulte sys.dm_os_workers (Transact-SQL). |
Aqui está a 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;
Conjunto de resultados.
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 comparação, o resultado a seguir mostra várias tarefas executáveis onde nenhuma delas está esperando para obter um trabalhador. work_queue_count é 0 para ambos os agendadores.
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