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 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 |
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 à 1 048 576. Les planificateurs qui sont identifiés par un numéro supérieur ou égal à 1 048 576 sont utilisés en interne par SQL Server, par exemple le planificateur de connexions administrateur dédiées. 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 c'était le cas dans SQL Server 2005. Pour plus d'informations sur l'affinité, consultez sys.dm_os_threads (Transact-SQL).
|
status |
nvarchar(60) |
Indique l'état du planificateur. Il peut s'agir de l'une des valeurs suivantes :
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é. 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 commutateurs 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 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, le context_switches_count n'est pas mis à jour, contrairement au yield_count.
|
idle_switches_count |
int |
Nombre de fois où le planificateur a attendu un événement quand il était inactif. Cette colonne est semblable à 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 :
Lorsqu'une tâche est terminée, la valeur de ce compteur est décrémentée. 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 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. 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. 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 de planificateur utilisé par SQLOS. |
Permissions
Requiert l'autorisation VIEW SERVER STATE 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 à 1 048 576. Les planificateurs possédant une valeur d'ID supérieure ou égale à 1 048 576 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, tandis que 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.
Notes
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