sys.dm_os_schedulers (Transact-SQL)

Retourne une ligne par planificateur dans SQL Server où chaque planificateur est associé à un processeur. Vous pouvez utiliser cet affichage pour surveiller la condition d'un planificateur ou pour identifier des tâches d'échappement.

Nom de colonne

Type de données

Description

scheduler_address

varbinary(8)

Adresse mémoire du planificateur. Cette colonne 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). Cette colonne n'accepte pas la valeur NULL.

scheduler_id

int

Identificateur du planificateur. Tous les planificateurs utilisés pour exécuter des requêtes régulières ont des numéros d'identificateur inférieurs à 255. Les planificateurs qui sont identifiés par un numéro supérieur ou égal à 255 sont utilisés en interne par SQL Server, par exemple le planificateur de connexions administrateur dédiées. Cette colonne n'accepte pas la valeur NULL.

cpu_id

smallint

ID du processeur auquel le planificateur est associé. Si SQL Server est configuré pour s'exécuter avec affinité, il s'agit de l'identificateur du processeur sur lequel le planificateur est supposé s'exécuter.

255 = aucun masque d'affinité n'est spécifié.

Cette colonne n'accepte pas la valeur NULL.

status

nvarchar(60)

Indique l'état du planificateur. Il peut s'agir de l'une des valeurs suivantes :

  • HIDDEN ONLINE

  • HIDDEN OFFLINE

  • VISIBLE ONLINE

  • VISIBLE OFFLINE

  • VISIBLE ONLINE (DAC)

  • HOT_ADDED

Cette colonne n'accepte pas la valeur NULL.

Les planificateurs HIDDEN servent à traiter les requêtes internes du 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 des processeurs disponibles sur le serveur, cette configuration peut indiquer que certains planificateurs sont associés à des processeurs non inclus dans le masque d'affinité. Auquel cas, cette colonne retourne la valeur 0, ce qui signifie que le planificateur n'est pas utilisé pour traiter des requêtes ou des traitements.

Cette colonne 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. Cette colonne 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 commutateurs de contexte ayant eu lieu sur ce planificateur. Cette colonne 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.

RemarqueRemarque
Si un processus de travail abandonne le planificateur et se place dans la file d'attente exécutable, puis ne trouve aucun autre processus de travail, il 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. Cette colonne 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 en attente d'un processus de travail pour les exécuter.

  • Tâches qui sont actuellement en attente ou en cours d'exécution (dotées de l'état SUSPENDED ou RUNNABLE).

Lorsqu'une tâche est terminée, la valeur de ce compteur est décrémentée. Cette colonne 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. Cette colonne 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. Cette colonne 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. Cette colonne 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. Cette colonne 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 compteur est incrémenté lorsque la demande est insérée. Le compteur est décrémenté lorsque la demande est terminée. Cette valeur n'indique pas l'état des E/S. Cette colonne 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. Dans SQL Server 2000, une tâche est routée vers un planificateur spécifique. Dans SQL Server, la décision de routage est effectuée 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 l'emplacement idéal pour l'acquisition des ressources. Lorsqu'une tâche est placée en file d'attente, le facteur de charge est incrémenté. Lorsqu'une tâche est terminée, le facteur de charge est décrémenté. Les facteurs de charge permettent un meilleur équilibrage de la charge de travail par le système d'exploitation SQL Server. Cette colonne 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. Cette colonne 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. Cette colonne 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. Cette colonne accepte la valeur NULL.

active_worker_address

varbinary(8)

Adresse mémoire du processus de travail actuellement actif. Cette colonne accepte 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. Cette colonne n'accepte pas la valeur NULL. Pour plus d'informations, consultez sys.dm_os_memory_objects (Transact-SQL).

Autorisations

L'autorisation VIEW SERVER STATE est nécessaire sur le serveur.

Exemples

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

La requête suivante produit l'état des processus de travail et des tâches dans SQL Server sur 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 l'ensemble des résultats.

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 :

  • Les planificateurs sont au nombre de cinq. Deux planificateurs possèdent une valeur d'ID inférieure à 255. Les planificateurs possédant une valeur d'ID supérieure ou égale à 255 sont qualifiés de 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 les demandes utilisateur qui ont été démarrées par SQL Server en plus des tâches de gestion des ressources. RESOURCE MONITOR (une par nœud NUMA), LAZY WRITER (une par nœud NUMA), LOCK MONITOR, CHECKPOINT et LOG WRITER sont des exemples de tâches SQL Server.

  • Le nœud NUMA 0 est mappé à l'UC 1 et le nœud NUMA 1 est mappé à l'UC 0. SQL Server démarre généralement sur un nœud NUMA autre que le nœud 0. Pour plus d'informations, consultez Présentation de l'accès NUMA (Non-uniform Memory Access).

  • 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 derniers sont affecté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 processus de travail auxquels sont associées des tâches 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).

La requête est la suivante :

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 l'ensemble des résultats.

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