sys.dm_os_schedulers (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 les pools élastiques, le compte d’administration du serveur, le compte d’administration Microsoft Entra ou l’appartenance dans ##MS_ServerStateReader##
au rôle de 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.
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 planificateur257
et le planificateur258
, 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'UC1
, le nœud NUMA1
à l'UC0
. SQL Server démarre généralement sur un nœud NUMA autre que le nœud 0.Lorsque
runnable_tasks_count
retourne0
, 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.
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)