Partilhar via


sys.dm_os_schedulers (Transact-SQL)

Aplica-se a:Banco de Dados SQL doAzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Banco de Dados SQL no Microsoft Fabric

Retorna uma linha por agendador no SQL Server onde cada agendador é mapeado para um processador individual. Use esse modo de exibição para monitorar a condição de um agendador ou para identificar tarefas descontroladas. Para mais informações sobre agendadores, consulte o Guia de Arquitetura de Threads e Tarefas.

Observação

Para chamar isto a partir do Azure Synapse Analytics ou Analytics Platform System (PDW), use o nome sys.dm_pdw_nodes_os_schedulers. Essa sintaxe não é suportada pelo pool SQL sem servidor no Azure Synapse Analytics.

Nome da coluna Tipo de dados Description
scheduler_address varbinary(8) Endereço de memória do agendador. Não é anulável.
parent_node_id int ID do nó a que pertence o agendador, também conhecido como nó pai. Isto representa um nó de acesso à memória não uniforme (NUMA). Não é anulável.
identificador_do_agendador int ID do agendador. Todos os agendadores usados para executar consultas regulares têm números de ID inferiores a 1048576. Os agendadores que têm IDs maiores ou iguais a 1048576 são usados internamente pelo SQL Server, como o agendador de ligação dedicado para administradores. Não é anulável.
cpu_id smallint ID de CPU atribuído ao agendador.

Não é anulável.

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

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

Não é anulável.

Os agendadores HIDDEN são usados para processar pedidos internos ao Motor de Base de Dados. Os agendadores VISIBLE são usados para processar pedidos dos utilizadores.

Os agendadores OFFLINE mapeiam para processadores que estão offline na máscara de afinidade e, portanto, não estão a ser usados para processar quaisquer pedidos. Os agendadores ONLINE mapeiam para processadores que estão online na máscara de afinidade e estão disponíveis para processar threads.

O DAC indica que o agendador está a correr sob uma ligação dedicada de administrador.

HOT ADDED indica que os escalonadores foram adicionados em resposta a um evento de hotadd da CPU.
is_online bit Se o SQL Server estiver configurado para usar apenas alguns dos processadores disponíveis no servidor, esta configuração pode significar que alguns escalonadores são mapeados para processadores que não estão na máscara de afinidade. Se for esse o caso, esta coluna devolve 0. Este valor significa que o escalonador não está a ser usado para processar consultas ou lotes.

Não é anulável.
is_idle bit 1 = O agendador está inativo. Atualmente, nenhum trabalhador está a funcionar. Não é anulável.
preemptive_switches_count int Número de vezes em que os trabalhadores deste escalonador mudaram para o modo preventivo.

Para executar código que está 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 alterna para o modo preventivo.
context_switches_count int Número de mudanças de contexto que ocorreram neste agendador. Não é anulável.

Para permitir que outros trabalhadores funcionem, o trabalhador em execução atual tem de abdicar do controlo do contexto do agendador ou do comutador.

Nota: Se um trabalhador ceder o agendador e se colocar na fila executável e depois não encontrar outros trabalhadores, o trabalhador irá selecionar-se a si próprio. Neste caso, o context_switches_count não é atualizado, mas o yield_count é atualizado.
idle_switches_count int Número de vezes que o agendador esteve à espera de um evento enquanto estava inativo. Esta coluna é semelhante à context_switches_count. Não é anulável.
current_tasks_count int Número de tarefas atuais associadas a este agendador. Esta contagem inclui o seguinte:

- Tarefas que aguardam que um trabalhador as execute.
- Tarefas que estão atualmente à espera ou a correr (em estado SUSPENSO ou EXECUTÁVEL).

Quando uma tarefa é concluída, esta contagem é decrescente. Não é anulável.
runnable_tasks_count int Número de trabalhadores, com tarefas atribuídas, que estão à espera de serem agendadas na fila executável. Não é anulável.
current_workers_count int Número de trabalhadores associados a este agendador. Esta contagem inclui trabalhadores que não são atribuídos a nenhuma tarefa. Não é anulável.
active_workers_count int Número de trabalhadores ativos. Um trabalhador ativo nunca é preventivo, deve ter uma tarefa associada, e está em execução, executável ou suspenso. Não é anulável.
work_queue_count bigint Número de tarefas na fila pendente. Estas tarefas estão à espera que um trabalhador as apanhe. Não é anulável.
pending_disk_io_count int Número de E/S pendentes que estão à espera de serem concluídos. Cada escalonador tem uma lista de E/S pendentes que são verificadas para determinar se foram concluídas sempre que há uma mudança de contexto. A contagem é incrementada quando o pedido é inserido. Esta contagem é decrementada quando o pedido é concluído. Este número não indica o estado das I/O. Não é anulável.
load_factor int Valor interno que indica a carga percebida neste escalonador. Este valor é usado para determinar se uma nova tarefa deve ser colocada neste agendador ou noutro agendador. Este valor é útil para fins de depuração quando parece que os agendadores não estão carregados de forma uniforme. A decisão de encaminhamento é tomada com base na carga no agendador. O SQL Server também utiliza um fator de carga de nós e agendadores para ajudar a determinar a melhor localização para adquirir recursos. Quando uma tarefa está em fila, o fator de carga aumenta. Quando uma tarefa é concluída, o fator de carga diminui. Usar os fatores de carga ajuda o sistema operativo SQL Server a equilibrar melhor a carga de trabalho. Não é anulável.
yield_count int Valor interno que é usado para indicar progresso neste agendador. Este valor é usado pelo Monitor do Agendador para determinar se um trabalhador no agendador não está a ceder o passo aos outros trabalhadores a tempo. Este valor não indica que o trabalhador ou a tarefa tenha passado para um novo trabalhador. Não é anulável.
last_timer_activity bigint Nos ticks da CPU, a última vez que a fila do temporizador do escalonador foi verificada pelo agendador. Não é anulável.
failed_to_create_worker bit Defina para 1 se não for possível criar um novo trabalhador neste agendador. Isto geralmente ocorre devido a limitações de memória. É anulável.
active_worker_address varbinary(8) Endereço de memória do trabalhador que está atualmente ativo. É anulável. Para 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 escalonador. Não é NULLÁVEL.
task_memory_object_address varbinary(8) Endereço de memória do objeto de memória da tarefa. Não é anulável. Para mais informações, consulte sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Identificado apenas para fins informativos. Não suportado. A compatibilidade futura não é garantida. Expõe o quântico do escalonador usado pelo SQLOS.
total_cpu_usage_ms bigint Aplica-se a: SQL Server 2016 (13.x) e versões posteriores

CPU total consumida por este agendador, conforme reportado por trabalhadores não preemptivos. Não é anulável.
total_cpu_idle_capped_ms bigint Identificado apenas para fins informativos. Não suportado. A compatibilidade futura não é garantida. Indica limitação com base no Objetivo do Nível de Serviço, será sempre 0 para versões não Azure do SQL Server. É anulável.
total_scheduler_delay_ms bigint Aplica-se a: SQL Server 2016 (13.x) e versões posteriores

O tempo entre um trabalhador trocar e outro entrar. Pode ser causado por trabalhadores preemptivos que atrasam o agendamento do próximo trabalhador não preemptivo, ou devido a threads de agendamento do sistema operativo de outros processos. Não é anulável.
ideal_workers_limit int Aplica-se a: SQL Server 2019 (15.x) e posteriores

Quantos trabalhadores deveriam idealmente estar no agendador. Se os trabalhadores atuais excederem o limite devido a uma carga de trabalho desequilibrada, quando ficarem inativos, serão reduzidos. Não é anulável.
pdw_node_id int Aplica-se a: Azure Synapse Analytics, Analytics Platform System (PDW)

O identificador do nó em que esta distribuição se encontra.

Permissions

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

No Banco de Dados SQL Basic, S0e S1 objetivos de serviço e para bancos de dados em pools elásticos , a conta de de administrador do servidor, a conta de de administrador do Microsoft Entra ou a associação aode função de servidor ##MS_ServerStateReader## é necessária. Em todos os outros objetivos de serviço do Banco de dados SQL, é necessária a permissão VIEW DATABASE STATE no banco de dados ou a associação à função de servidor ##MS_ServerStateReader##.

Permissões para SQL Server 2022 e posterior

Requer a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Examples

A. Monitorização de agendadores ocultos e não ocultos

A consulta seguinte apresenta o estado dos trabalhadores e tarefas no SQL Server em todos os agendadores. Esta consulta foi executada num sistema informático que tem o seguinte:

  • Dois processadores (CPUs)

  • Dois nós (NUMA)

  • Um CPU por nó NUMA

  • Máscara de afinidade definida para 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;  

Aqui está 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  

O resultado fornece a seguinte informação:

  • Existem cinco agendadores. Dois schedulers têm um valor < ID 1048576. Os agendadores com ID >= 1048576 são conhecidos como agendadores ocultos. O agendador 255 representa a ligação dedicada do administrador (DAC). Existe um agendador de DAC por instância. Monitores de recursos que coordenam a pressão de memória utilizam o escalonador 257 e o escalonador 258, um por nó NUMA

  • Existem 23 tarefas ativas na saída. Estas tarefas incluem pedidos de utilizadores, além de tarefas de gestão de recursos iniciadas pelo SQL Server. Exemplos de tarefas SQL Server são RESOURCE MONITOR (uma por nó NUMA), LAZY WRITER (uma por nó NUMA), LOCK MONITOR, CHECKPOINT e LOG WRITER.

  • O nó 0 NUMA é mapeado para a CPU 1 e o 1 nó NUMA é mapeado para a CPU 0. O SQL Server normalmente começa num nó NUMA diferente do nó 0.

  • Ao runnable_tasks_count retornar 0, não há tarefas em execução ativa. No entanto, podem existir sessões ativas.

  • O scheduler 255 que representa o DAC tem 3 trabalhadores associados a ele. Estes trabalhadores são alocados no arranque do SQL Server e não mudam. Estes trabalhadores são usados apenas para processar consultas DAC. As duas tarefas neste agendador representam um gestor de ligação e um trabalhador ocioso.

  • active_workers_count representa todos os trabalhadores que têm tarefas associadas e estão a correr em modo não preemptivo. Algumas tarefas, como ouvintes de rede, são executadas sob agendamento preventivo.

  • Os agendadores ocultos não processam pedidos típicos dos utilizadores. O agendador do DAC é a exceção. Este agendador de DAC tem um único thread para processar pedidos.

B. Monitorização de agendadores não ocultos num sistema ocupado

A consulta seguinte mostra o estado dos agendadores não ocultos fortemente carregados, onde existem mais pedidos do que os trabalhadores disponíveis podem gerir. Neste exemplo, 256 trabalhadores são atribuídos a tarefas. Algumas tarefas estão à espera de uma atribuição a um trabalhador. Menor número de tarefas executáveis implica que várias tarefas estão à espera de um recurso.

Observação

Pode saber a situação dos trabalhadores ao consultar sys.dm_os_workers. Para mais informações, consulte sys.dm_os_workers (Transact-SQL).

Aqui está a questão:

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;  

Aqui está 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  

Em comparação, o resultado seguinte mostra múltiplas tarefas executáveis onde nenhuma tarefa está à espera de obter um trabalhador. É work_queue_count0 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  

Consulte também

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