Compartilhar via


sys.dm_os_schedulers (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

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. Para obter mais informações sobre agendadores, consulte o Guia de arquitetura de thread e tarefa.

Observação

Para chamar isso do Azure Synapse Analytics ou do PDW (Analytics Platform System), use o nome sys.dm_pdw_nodes_os_schedulers. Não há suporte a essa sintaxe para o pool de SQL sem servidor no Azure Synapse Analytics.

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 normais têm números de ID menores que 1048576. Os agendadores que têm IDs maiores ou iguais a 1048576 são usados internamente pelo SQL Server, como o agendador de conexão do administrador dedicado. Não permite valor nulo.
cpu_id smallint A ID da CPU atribuída ao agendador.

Não permite valor nulo.

Observação: 255 não indica nenhuma afinidade como no SQL Server 2005 (9.x). Consulte sys.dm_os_threads (Transact-SQL) para obter informações adicionais sobre afinidade.
status nvarchar(60) Indica o status do agendador. Pode ser um dos seguintes valores:

- ESCONDIDO ONLINE
- OCULTO OFFLINE
- VISÍVEL ONLINE
- VISÍVEL OFFLINE
- VISÍVEL ONLINE (DAC)
- HOT_ADDED

Não permite valor nulo.

Os agendadores HIDDEN são usados para processar solicitações internas ao 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 CPU de adição a quente.
is_online bit Se o SQL Server estiver configurado para usar apenas alguns dos processadores disponíveis no servidor, essa configuração poderá significar que alguns agendadores serã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á ocioso. Nenhum operador está em execução no momento. Não permite valor nulo.
preemptive_switches_count int Número de vezes que os operadores deste 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 preventivo. Para fazer isso, um trabalhador muda para o modo preventivo.
context_switches_count int Número de alternâncias de contexto ocorridas 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 produzir o agendador e se colocar na fila executável e, em seguida, não encontrar outros trabalhadores, o trabalhador 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á ocioso. Esta coluna é semelhante à context_switches_count. Não permite valor nulo.
current_tasks_count int Número de tarefas associadas a este agendador no momento. Esta contagem inclui o seguinte:

- Tarefas que estão aguardando a execução de um trabalhador.
- Tarefas que estão atualmente aguardando ou em execução (no estado SUSPENSO ou EXECUTÁVEL).

Quando uma tarefa é concluída, esta contagem é reduzida. Não permite valor nulo.
runnable_tasks_count int Número de operadores, 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 operadores associados a este agendador. Essa contagem inclui operadores que não estão atribuídos a nenhuma tarefa. Não permite valor nulo.
active_workers_count int Número de operadores ativos. Um operador 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 serem selecionadas por um operador. 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. A decisão de roteamento é tomada com base na carga do agendador. O SQL Server também usa 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 dos fatores de carga ajuda o sistema operacional 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 operador ou tarefa para um novo operador. Não permite valor nulo.
last_timer_activity bigint Em tiques 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 operador 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 operador 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 é NULLABLE.
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, confira sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Identificado apenas para fins informativos. Não há suporte. A compatibilidade futura não está garantida. Expõe o quantum do agendador usado pelo SQLOS.
total_cpu_usage_ms bigint Aplica-se a: SQL Server 2016 (13.x) e posterior

Total de CPU consumida por esse agendador, conforme relatado por trabalhadores não preemptivos. Não permite valor nulo.
total_cpu_idle_capped_ms bigint Identificado apenas para fins informativos. Não há suporte. A compatibilidade futura não está garantida. Indica a limitação com base no Objetivo de Nível de Serviço, sempre será 0 para versões não Azure do SQL Server. Permite valor nulo.
total_scheduler_delay_ms bigint Aplica-se a: SQL Server 2016 (13.x) e posterior

O tempo entre a troca de um trabalhador e a entrada de outro. Pode ser causado por trabalhos preemptivos que atrasam o agendamento do próximo trabalhador não preemptivo ou devido aos threads de agendamento do sistema operacional de outros processos. Não permite valor nulo.
ideal_workers_limit int Aplica-se a: SQL Server 2019 (15.x) e versões posteriores

Idealmente, quantos trabalhadores devem estar no agendador. Se os trabalhadores atuais excederem o limite devido à carga de tarefas desequilibrada, uma vez que fiquem ociosos, eles serão cortados. Não permite valor nulo.
pdw_node_id int Aplica-se a: Azure Synapse Analytics, Analytics Platform System (PDW)

O identificador do nó em que essa distribuição está ativada.

Permissões

No SQL Server e na Instância Gerenciada de SQL, requer a permissão VIEW SERVER STATE.

Nos objetivos de serviço do Banco de Dados SQL Básico, S0 e S1 e para bancos de dados em pools elásticos, é necessário ter a conta do administrador do servidor, a conta do administrador do Microsoft Entra ou a associação à ##MS_ServerStateReader## função de servidor. Em todos os outros objetivos de serviço do Banco de Dados SQL, a permissão VIEW DATABASE STATE no banco de dados ou a associação à função de servidor ##MS_ServerStateReader## são necessárias.

Permissões do SQL Server 2022 e posteriores

É necessária a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Exemplos

R. Monitorando agendadores ocultos e não ocultos

A consulta a seguir gera o estado dos trabalhos 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;  

Veja a seguir o 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:

  • Existem cinco agendadores. Dois agendadores têm um valor < de ID 1048576. Os agendadores com ID >= 1048576 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ário, além de tarefas de gerenciamento de recursos que foram iniciadas pelo SQL Server. Exemplos de tarefas do SQL Server são RESOURCE MONITOR (um por nó NUMA), LAZY WRITER (um por nó NUMA), LOCK MONITOR, CHECKPOINT e LOG WRITER.

  • 0 de nó NUMA é mapeado para CPU 1 e nó NUMA 1 é mapeado para 0de CPU. O SQL Server normalmente é iniciado em um nó NUMA diferente do nó 0.

  • 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 trabalhos 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 têm tarefas associadas e estão sendo 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).

Esta é 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;  

Veja a seguir o 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  

Confira também

Exibições de gerenciamento dinâmico relacionadas ao sistema operacional do SQL Server (Transact-SQL)