sys.dm_os_schedulers (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Retourne une ligne par planificateur dans SQL Server où chaque planificateur est associé à un processeur. Vous pouvez utiliser cette vue pour surveiller la condition d'un planificateur ou pour identifier des tâches d'échappement. Pour plus d’informations sur les planificateurs, consultez le Guide d’architecture des threads et des tâches.

Remarque

Pour l’appeler à partir d’Azure Synapse Analytics ou d’Analytics Platform System (PDW), utilisez le nom sys.dm_pdw_nodes_os_schedulers. Cette syntaxe n’est pas prise en charge par le pool SQL serverless dans Azure Synapse Analytics.

Nom de la colonne Type de données Description
scheduler_address varbinary(8) Adresse mémoire du planificateur. N'accepte pas la valeur NULL.
parent_node_id int Identificateur du nœud auquel le planificateur appartient. On parle également de nœud parent. Il s'agit d'un nœud NUMA (Nonuniform Memory Access). N'accepte pas la valeur NULL.
scheduler_id int ID du planificateur. Tous les planificateurs utilisés pour exécuter des requêtes régulières ont des numéros d'identificateur inférieurs à 1 048 576. Ces planificateurs qui ont des ID supérieurs ou égaux à 1048576 sont utilisés en interne par SQL Server, tels que le planificateur de connexions d’administrateur dédié. N'accepte pas la valeur NULL.
cpu_id smallint ID de l'UC assigné au planificateur.

N'accepte pas la valeur NULL.

Remarque : 255 n’indique pas d’affinité comme dans SQL Server 2005 (9.x). Consultez sys.dm_os_threads (Transact-SQL) pour obtenir des informations d’affinité supplémentaires.
statut nvarchar(60) Indique l'état du planificateur. Peut avoir l’une des valeurs suivantes :

- HIDDEN ONLINE
- MASQUÉ HORS CONNEXION
- VISIBLE EN LIGNE
- VISIBLE HORS CONNEXION
- VISIBLE ONLINE (DAC)
- HOT_ADDED

N'accepte pas la valeur NULL.

Les planificateurs MASQUÉs sont utilisés pour traiter les demandes internes au Moteur de base de données. Les planificateurs VISIBLE servent à traiter les requêtes des utilisateurs.

Les planificateurs OFFLINE se mappent avec des processeurs qui sont déconnectés dans le masque d'affinité et qui ne sont, par conséquent, pas utilisés pour traiter des requêtes. Les planificateurs ONLINE se mappent avec des processeurs qui sont connectés dans le masque d'affinité et qui sont disponibles pour traiter des threads.

DAC indique que le planificateur s'exécute sous une connexion administrateur dédiée (DAC, Dedicated Administrator Connection).

HOT ADDED indique que les planificateurs ont été ajoutés en réponse à un événement d'ajout d'un processeur à chaud.
is_online bit Si SQL Server est configuré pour utiliser uniquement certains processeurs disponibles sur le serveur, cette configuration peut signifier que certains planificateurs sont mappés aux processeurs qui ne se trouvent pas dans le masque d’affinité. Dans ce cas, cette colonne retourne la valeur 0. Cette valeur signifie que le planificateur n'est pas utilisé pour traiter des requêtes ou des lots.

N'accepte pas la valeur NULL.
is_idle bit 1 = Le planificateur est inactif. Aucun processus de travail n'est actuellement en cours d'exécution. N'accepte pas la valeur NULL.
preemptive_switches_count int Nombre de fois où les processus de travail opérant sur ce planificateur sont passés en mode préemptif.

Pour exécuter du code externe à SQL Server (par exemple des procédures stockées étendues et des requêtes distribuées), un thread doit s’exécuter en dehors du contrôle du planificateur non préemptif. Pour ce faire, un processus de travail passe en mode préemptif.
context_switches_count int Nombre de changements de contexte ayant eu lieu sur ce planificateur. N'accepte pas la valeur NULL.

Pour permettre à d'autres processus de travail de s'exécuter, le processus de travail en cours doit abandonner le contrôle du planificateur ou changer de contexte.

Remarque : si un worker génère le planificateur et se place dans la file d’attente runnable, puis ne trouve aucun autre travailleur, le worker se sélectionne lui-même. Dans ce cas, context_switches_count n'est pas mis à jour, mais yield_count l'est.
idle_switches_count int Nombre de fois où le planificateur a attendu un événement quand il était inactif. Cette colonne est similaire à context_switches_count. N'accepte pas la valeur NULL.
current_tasks_count int Nombre de tâches actuellement associées au planificateur. Il s'agit des tâches suivantes :

- Tâches qui attendent qu’un worker les exécute.
- Tâches en attente ou en cours d’exécution (dans l’état SUSPENDED ou RUNNABLE).

Lorsqu'une tâche est terminée, ce nombre est décrémenté. N'accepte pas la valeur NULL.
runnable_tasks_count int Nombre de processus de travail, auxquels des tâches sont affectées, qui attendent d'être planifiés sur la file d'attente exécutable. N'accepte pas la valeur NULL.
current_workers_count int Nombre de processus de travail qui sont associés à ce planificateur. Il s'agit des processus de travail qui ne sont affectés à aucune tâche. N'accepte pas la valeur NULL.
active_workers_count int Nombre de processus de travail actifs. Un processus de travail actif n'est jamais préemptif, doit être associé à une tâche et est soit en cours d'exécution, soit exécutable, soit suspendu. N'accepte pas la valeur NULL.
work_queue_count bigint Nombre de tâches dans la file d'attente de travail. Ces tâches attendent d'être sélectionnées par un processus de travail. N'accepte pas la valeur NULL.
pending_disk_io_count int Nombre d'E/S qui sont en attente. Chaque planificateur possède une liste d'E/S en attente, lesquelles sont vérifiées lors de chaque changement de contexte pour déterminer si elles ont été effectuées. Le nombre est incrémenté lorsque la demande est insérée. Le nombre est décrémenté lorsque la demande est terminée. Cette valeur n'indique pas l'état des E/S. N'accepte pas la valeur NULL.
load_factor int Valeur interne qui indique la charge perçue sur le planificateur. Cette valeur est utilisée pour déterminer si une nouvelle tâche doit être placée sur ce planificateur ou sur un autre planificateur. Cette valeur est utile à des fins de débogage, lorsqu'il apparaît que les planificateurs ne sont pas chargés de façon uniforme. La décision de routage est prise en fonction de la charge placée sur le planificateur. SQL Server utilise également un facteur de charge des nœuds et des planificateurs pour déterminer le meilleur emplacement pour acquérir des ressources. Lorsqu'une tâche est empilée, le facteur de charge est incrémenté. Lorsqu'une tâche est terminée, le facteur de charge est décrémenté. L’utilisation des facteurs de charge permet au système d’exploitation SQL Server d’équilibrer mieux la charge de travail. N'accepte pas la valeur NULL.
yield_count int Valeur interne utilisée pour indiquer la progression du travail sur le planificateur. Cette valeur permet à la tâche système interne de déterminer si un processus de travail du planificateur ne transmet pas ses résultats aux autres processus de travail à temps. Elle n'indique pas que le processus de travail ou la tâche est passé à un nouveau processus de travail. N'accepte pas la valeur NULL.
last_timer_activity bigint Dans les cycles de l'UC, cette valeur indique à quel moment a eu lieu la dernière vérification de la file d'attente du minuteur par le planificateur. N'accepte pas la valeur NULL.
failed_to_create_worker bit Cette valeur est définie à 1 s'il a été impossible de créer un nouveau processus de travail sur le planificateur. Ce problème est souvent la conséquence de contraintes de mémoire. Autorise la valeur NULL.
active_worker_address varbinary(8) Adresse mémoire du processus de travail actuellement actif. Autorise la valeur NULL. Pour plus d’informations, consultez sys.dm_os_workers (Transact-SQL).
memory_object_address varbinary(8) Adresse mémoire de l'objet mémoire du planificateur. Cette colonne n'accepte pas la valeur NULL.
task_memory_object_address varbinary(8) Adresse mémoire de l'objet mémoire de la tâche. N'accepte pas la valeur NULL. Pour plus d’informations, consultez sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Identifié à titre d'information uniquement. Non pris en charge. La compatibilité future n'est pas garantie. Expose le quantum du planificateur utilisé par SQLOS.
total_cpu_usage_ms bigint S’applique à : SQL Server 2016 (13.x) et versions ultérieures

Processeur total consommé par ce planificateur comme indiqué par les workers non préemptifs. N'accepte pas la valeur NULL.
total_cpu_idle_capped_ms bigint Identifié à titre d'information uniquement. Non pris en charge. La compatibilité future n'est pas garantie. Indique la limitation basée sur l’objectif de niveau de service, sera toujours 0 pour les versions autres qu’Azure de SQL Server. Autorise la valeur NULL.
total_scheduler_delay_ms bigint S’applique à : SQL Server 2016 (13.x) et versions ultérieures

Temps entre un travailleur qui bascule et un autre. Peut être provoqué par des workers préemptifs qui retardent la planification du prochain worker non préemptif ou en raison des threads de planification du système d’exploitation à partir d’autres processus. N'accepte pas la valeur NULL.
ideal_workers_limit int S’applique à : SQL Server 2019 (15.x) et versions ultérieures

Nombre de travailleurs qui doivent idéalement se trouver sur le planificateur. Si les travailleurs actuels dépassent la limite en raison d’une charge de tâche déséquilibrée, une fois qu’ils deviennent inactifs, ils seront réduits. N'accepte pas la valeur NULL.
pdw_node_id int S’applique à : Azure Synapse Analytics, Analytics Platform System (PDW)

Identificateur du nœud sur lequel cette distribution est activée.

Autorisations

Sur SQL Server et SQL Managed Instance, l’autorisation VIEW SERVER STATE est requise.

Sur les objectifs de service SQL Database Basic, S0 et S1, et pour les bases de données dans des pools élastiques, le compte d’administrateur du serveur, le compte d’administrateur Microsoft Entra ou l’appartenance au ##MS_ServerStateReader##rôle serveur est requis. Sur tous les autres objectifs de service SQL Database, l’autorisation VIEW DATABASE STATE sur la base de données ou l’appartenance au rôle serveur ##MS_ServerStateReader## est requise.

Autorisations pour SQL Server 2022 (et versions plus récentes)

Nécessite l’autorisation VIEW SERVER PERFORMANCE STATE sur le serveur.

Exemples

R. Analyse des planificateurs masqués et non masqués

La requête suivante génère l’état des workers et des tâches dans SQL Server dans tous les planificateurs. Cette requête a été exécutée sur un système informatique présentant la configuration suivante :

  • Deux processeurs (UC)

  • Deux nœuds (NUMA)

  • Une UC par nœud NUMA

  • Masque d'affinité défini à 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;  

Voici le jeu de résultats obtenu.

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  

Le résultat de la requête fournit les informations suivantes :

  • Il y a cinq planificateurs. Deux planificateurs ont une valeur < d’ID 1048576. Les planificateurs avec ID >= 1048576 sont appelés planificateurs masqués. Le planificateur 255 représente la connexion administrateur dédiée (DAC). Il existe un planificateur DAC par instance. Les moniteurs de ressources qui coordonnent la sollicitation de la mémoire utilisent le planificateur 257 et le planificateur 258, un par nœud NUMA.

  • Le résultat présente 23 tâches actives. Ces tâches incluent des requêtes utilisateur en plus des tâches de gestion des ressources qui ont été démarrées par SQL Server. Des exemples de tâches SQL Server sont RESOURCE MONITOR (un par nœud NUMA), LAZY WRITER (un par nœud NUMA), LOCK MONITOR, CHECKPOINT et LOG WRITER.

  • Le nœud NUMA 0 est mappé à l'UC 1, le nœud NUMA 1 à l'UC 0. SQL Server démarre généralement sur un nœud NUMA autre que le nœud 0.

  • Lorsque runnable_tasks_count retourne 0, aucune tâche n'est activement exécutée. Il peut cependant exister des sessions actives.

  • Le planificateur 255 représentant la connexion administrateur dédiée (DAC) est associé à 3 processus de travail. Ces workers sont alloués au démarrage de SQL Server et ne changent pas. Ils sont utilisés pour traiter les requêtes à l'aide de la connexion administrateur dédiée uniquement. Les deux tâches sur ce planificateur représentent un gestionnaire de connexions et un processus de travail inactif.

  • active_workers_count représente tous les workers qui ont des tâches associées et qui s’exécutent en mode non préemptif. Certaines tâches, comme les écouteurs de réseau, s'exécutent en mode de planification préemptive.

  • Les planificateurs masqués ne traitent pas les demandes utilisateur standard. Le planificateur DAC constitue l'exception. Ce planificateur DAC possède un thread pour traiter les demandes.

B. Analyse des planificateurs non masqués dans un système occupé

La requête suivante indique l'état des planificateurs non masqués particulièrement chargés, lorsque la quantité de requêtes existante est supérieure à la quantité pouvant être gérée par les processus de travail disponibles. Dans cet exemple, 256 processus de travail sont affectés à des tâches. Certaines tâches sont en attente d'une affectation à un processus de travail. Un nombre exécutable faible implique que plusieurs tâches attendent une ressource.

Remarque

Vous pouvez interroger sys.dm_os_workers pour trouver l'état des processus de travail. Pour plus d’informations, consultez sys.dm_os_workers (Transact-SQL).

Voici la requête :

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;  

Voici le jeu de résultats obtenu.

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  

En comparaison, le résultat suivant affiche plusieurs tâches exécutables où aucune tâche n'attend l'obtention d'un processus de travail. work_queue_count a la valeur 0 pour les deux planificateurs.

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  

Voir aussi

Vues de gestion dynamique SQL Server liées au système d'exploitation (Transact-SQL)