Affichage Threads (niveau de performance parallèle)
La Vue Threads est la plus détaillée et la plus riche en fonctionnalités du Visualiseur concurrentiel.À l'aide de cette vue, vous pouvez déterminer si les threads s'exécutent ou se bloquent pour des raisons de synchronisation, d'E/S ou autres.
Pendant l'analyse de profil, le Visualiseur concurrentiel examine tous les événements liés aux changements de contexte du système d'exploitation pour chaque thread d'application.Les changements de contexte peuvent se produire pour de nombreuses raisons, notamment les suivantes :
Un thread est bloqué sur une primitive de synchronisation.
Le quantum d'un thread expire.
Un thread émet une requête d'E/S bloquante.
La vue Threads assigne une catégorie à chaque changement de contexte lorsqu'un thread a cessé de s'exécuter.Les catégories sont affichées dans la légende en bas à gauche dans la vue.Le Visualiseur concurrentiel catégorise les événements liés aux changements de contexte en recherchant des API bloquantes connues dans la pile des appels du thread.S'il n'existe aucune correspondance dans la pile des appels, la raison d'attente qui est fournie par Windows est utilisée.Toutefois, la catégorie Windows peut être basée sur un détail d'implémentation et peut ne pas refléter l'intention de l'utilisateur.Par exemple, Windows stocke la raison d'attente pour bloquer sur un verrou en lecture-écriture mince natif comme E/S au lieu de la synchronisation.Dans la plupart des cas, vous pouvez identifier la cause première d'un événement de blocage en examinant les piles d'appels qui correspondent aux événements liés aux changements de contexte.
La vue Threads affiche également les dépendances entre les threads.Par exemple, si vous identifiez un thread qui est bloqué sur un objet de synchronisation, vous pouvez rechercher le thread qui l'a débloqué, et vous pouvez examiner l'activité sur la pile des appels pour ce thread au point lorsqu'il a débloqué l'autre.
Lorsque les threads s'exécutent, le Visualiseur concurrentiel collecte des échantillons.Dans la vue Threads, vous pouvez analyser quel code est exécuté par un ou plusieurs threads au cours d'un segment de l'exécution.Vous pouvez également examiner les rapports de blocage, et les rapports qui profilent l'exécution de l'arborescence de la pile des appels.
Utilisation
Voici quelques méthodes que vous pouvez utiliser avec la vue Threads :
identification des raisons pour lesquelles l'interface utilisateur d'une application ne répond pas pendant certaines phases d'exécution.
identification de la durée du blocage sur la synchronisation, les E/S, les défauts de page, et d'autres événements.
identification du degré d'interférence depuis les autres processes qui s'exécutent sur le système.
identification des problèmes d'équilibrage de charge pour l'exécution en parallèle.
Identification des raisons de la faiblesse ou d'un manque total d'extensibilité (par exemple, la raison pour laquelle les performances d'une application parallèle ne s'améliorent pas lorsque davantage de cœurs logiques sont disponibles).
Compréhension du degré d'accès concurrentiel dans l'application pour aider la parallélisation.
compréhension des dépendances entre les threads de travail et les chemins critiques d'exécution.
Examiner les plages horaires et les threads spécifiques
La vue Threads affiche une barre de planning.Vous pouvez effectuer un zoom et filtrer dans la chronologie pour examiner des plages spécifiques et les threads de votre application.Sur l'axe des x se trouve le temps et sur l'axe des y se trouvent plusieurs canaux :
Deux canaux E/S pour chaque lecteur de disque sur le système, un canal pour les lectures et un pour les écritures.
Un canal pour chaque thread dans le processus.
Canaux de marqueur, s'il existe des événements de marqueur dans la trace.Les canaux de marqueur apparaissent initialement dans les canaux de thread qui ont généré ces événements.
Canaux de GPU.
Voici une illustration de la vue Threads :
Vue Threads
Initialement, les threads sont triés par ordre de création, afin que le thread d'application principal soit le premier.Vous pouvez utiliser l'option de tri dans le coin supérieur gauche de la vue pour trier des threads selon un autre critère (par exemple, par plus grand travail d'exécution accompli).
Vous pouvez masquer les threads qui n'exécutent aucun travail dans le scénario concerné en sélectionnant leur nom dans la colonne de gauche et en cliquant sur le bouton Masquer les threads sélectionnés dans la barre d'outils.Nous vous conseillons de masquer les threads sont complètement bloqués, car leurs statistiques sont inutiles et peuvent encombrer les rapports.
Pour identifier des threads supplémentaires à masquer, dans la légende active, choisissez le rapport Synthèse Par Thread sur l'onglet Rapport des Profils.Cela affiche le graphique de répartition de l'exécution, qui indique l'état des threads pendant l'intervalle de temps actuellement sélectionné.À certains niveaux de zoom, plusieurs threads peuvent ne pas être affichés.Lorsque cela se produit, les ellipses sont affichés à droite.
Lorsque vous avez sélectionné un intervalle de temps et plusieurs threads dans cet objet, vous pouvez démarrer votre analyse des performances.
Outils d'Analyse
Cette section décrit les rapports et autres outils d'analyse.
Détails de blocage d'un thread
Pour obtenir des informations sur un événement bloquant dans une région particulière sur un thread, placez le pointeur sur cette zone pour afficher une info-bulle.Elle contient des informations telles que la catégorie, l'heure de démarrage de la région, le temps de blocage, et une API bloquante s'il y en a une.Si vous sélectionnez la région de blocage, la pile à ce point dans le temps est affichée dans le volet inférieur, avec les mêmes informations que celles affichées dans l'info-bulle.En examinant la pile des appels, vous pouvez déterminer la raison sous-jacente de l'événement de blocage de thread.Vous pouvez trouver des informations supplémentaires de processus et de threads en sélectionnant le segment et en examinant l'onglet actuel.
Un chemin d'exécution peut avoir plusieurs événements bloquants.Vous pouvez examiner ces derniers par catégorie de blocage afin de pouvoir rechercher des zones à problèmes plus rapidement.Choisissez parmi les catégories de blocage dans la légende sur la gauche.
Les dépendances entre les threads
Le Visualiseur concurrentiel peut afficher les dépendances entre les threads dans votre processus afin de pouvoir déterminer ce qu'un thread bloqué essayait d'effectuer et pour savoir quel autre thread l'a autorisé à s'exécuter.Pour déterminer quel thread a débloqué un autre thread, sélectionnez le segment de blocage approprié.Si le Visualiseur concurrentiel peut déterminer le thread de déblocage, il trace une ligne entre le thread de déblocage et le segment d'exécution qui suit le segment de blocage.De plus, l'onglet Pile de déblocage montre la pile des appels appropriée.
Détails de l'exécution du thread
Dans le graphe chronologique d'un thread, les segments verts indiquent quand il exécutait le code.Vous pouvez obtenir des informations plus détaillées sur un segment de l'exécution.
Lorsque vous sélectionnez un point dans un segment d'exécution, le Visualiseur concurrentiel recherche ce moment sur la pile des appels appropriée et affiche un signe d'insertion noir au-dessus du point sélectionné dans le segment d'exécution et affiche la pile des appels elle-même sur l'onglet Pile active.Vous pouvez sélectionner plusieurs points sur le segment d'exécution.
[!REMARQUE]
Le Visualiseur concurrentiel ne peut pas résoudre une sélection dans un segment d'exécution.En général, cela se produit lorsque la durée du segment est moins d'une milliseconde.
Pour obtenir un profil d'exécution pour tous les threads activés (affichés) dans la plage horaire actuellement sélectionnée, choisissez le bouton Exécution dans la légende active.
Graphique de chronologie
Le graphique de chronologie présente l'activité de tous les threads dans le processus et de toutes les unités de disque physiques sur l'ordinateur hôte.Elle affiche également des événements d'activité et de marqueur de GPU. Vous pouvez effectuer un zoom pour afficher davantage de détails ou pour afficher un plus long intervalle de temps.Vous pouvez également sélectionner des points sur le graphique pour obtenir des informations sur les catégories, les heures de démarrage, les durées, et les rapports de pile des appels.
Dans le graphique chronologique, une couleur indique l'état d'un thread à un moment donné.Par exemple, les segments verts étaient en cours d'exécution, les segments rouges étaient bloqués à des fins de synchronisation, les segments jaunes étaient anticipés et les segments violets prenaient part aux E/S du périphérique.Vous pouvez utiliser cette vue pour l'examen de l'équilibre du travail pour un groupe de threads impliqués dans une boucle parallèle ou dans des tâches simultanées.Si un thread est plus longue à exécuter que les autres, le travail peut être non équilibré.Vous pouvez utiliser ces informations pour améliorer les performances de votre programme lorsque vous distribuez le travail plus équitablement entre les threads.
Si un seul thread est vert (en cours d'exécution) à cet instant-là dans le temps, l'application pourrait ne pas tirer complètement parti de l'accès concurrentiel sur le système.Vous pouvez également utiliser le graphique chronologique pour examiner les dépendances entre les threads et les relations temporelles qui existent entre les threads de blocage et bloqués.Pour réorganiser des threads, sélectionnez un thread puis dans la barre d'outils, cliquez sur le bouton haut ou bas.Pour masquer des threads, sélectionnez-les puis choisissez le bouton Masquer des threads.
Rapports de profil
Sous le graphique chronologique se trouve un profil de chronologique et un volet qui a des onglets pour différents rapports.Les rapports se mettent à jour automatiquement lorsque vous modifiez la vue Threads.Pour de grands traçages, le volet de rapports peut être indisponible pendant que les mises à jour sont calculées.Chaque rapport possède deux réglages de filtre : Réduction du bruit et Uniquement Mon Code.La réduction du bruit permet d'éliminer les entrées de l'arborescence des appels pour lesquelles le temps passé est très faible.La valeur par défaut du filtre s'élève à 2%, mais vous pouvez l'ajuster de 0 à 99%.Pour afficher uniquement l'arborescence des appels pour votre code, cochez la case Uniquement Mon Code.Pour afficher toutes les arborescences des appels, effacez-la.
Rapport des profils
Cet onglet affiche les rapports qui correspondent aux entrées dans la légende active.Pour afficher un rapport, choisissez l'une des entrées.
Pile active
Cet onglet affiche la pile des appels pour un point sélectionné sur un segment de thread dans le graphique chronologique.Les piles des appels sont tronquées pour afficher seulement l'activité directement liée à votre programme.
Pile de déblocage
Pour voir quel thread a débloqué le thread sélectionné, et à quelle ligne de code, choisissez l'onglet Pile de déblocage.
Exécution
Le rapport d'exécution affiche à la répartition du temps que l'application a dépensé pour l'exécution.
Pour trouver la ligne de code dans lequel est passé le temps d'exécution, développez l'arborescence des appels et ensuite, dans le menu contextuel de l'entrée de l'arborescence des appels, choisissez Afficher la Source ou Afficher les Sites d'Appel.Afficher la Source localise la ligne de code exécutée.Afficher les Sites d'Appel recherche la ligne de code ayant appelé la ligne de code exécutée.Si un seul site d'appel existe, sa ligne de code est mise en surbrillance.S'il existe plusieurs sites d'appel, vous pouvez sélectionner celui que vous souhaitez dans la boîte de dialogue qui apparaît puis choisir le bouton Atteindre la source pour mettre en surbrillance le code du site d'appel.Il s'avère souvent très utile de situer le code source du site d'appel comportant le plus d'instances et/ou le plus de temps.Pour plus d'informations, consultez Profil d'exécution (rapport).
Synchronisation
Le rapport Synchronisation affiche les appels responsables des blocs de synchronisation, ainsi que les temps de blocage d'agrégation de chaque pile des appels.Pour plus d'informations, consultez Durée de synchronisation.
E/S
Le rapport d'E/S affiche les appels responsables des blocs d'E/S, ainsi que les temps de blocage d'agrégation de chaque pile des appels.Pour plus d'informations, consultez Temps d'E/S (vue Threads).
Sleep
Le rapport Veille affiche les appels responsables des blocs de veille, ainsi que les temps de blocage d'agrégation de chaque pile des appels.Pour plus d'informations, consultez Durée de veille.
Gestion de la mémoire
Le rapport de gestion de la mémoire affiche les appels où se sont produits des blocs de gestion de la mémoire, ainsi que les temps de blocage d'agrégation de chaque pile des appels.Vous pouvez utiliser ces informations pour identifier des zones qui ont une pagination excessive ou des problèmes de garbage collection. Pour plus d'informations, consultez Période de gestion de la mémoire.
Préemption
Le rapport de préemption affiche les instances où les processes sur le système ont préempté le processus actuel et les threads individuels qui ont remplacé des threads dans le processus actuel.Vous pouvez utiliser ces informations pour identifier les processus et les threads qui sont plus chargés de préemption.Pour plus d'informations, consultez Durée de préemption.
Traitement IU
Le rapport Traitement IU affiche les appels responsables des blocs de traitement IU, ainsi que les temps de blocage d'agrégation de chaque pile des appels.Pour plus d'informations, consultez Temps de traitement UI.
Synthèse par thread
Cet onglet affiche une vue de colonne à code de couleurs de la durée totale que chaque thread a consacré à l'exécution, aux E/S bloqués et à d'autres états.Des étiquettes s'affichent en bas des colonnes.Lorsque vous réglez le niveau de zoom dans le graphe chronologique, cet onglet est automatiquement mis à jour.À certains niveaux de zoom, plusieurs threads peuvent ne pas être affichés.Lorsque cela se produit, les ellipses sont affichés à droite.Si le thread que vous souhaitez ne s'affiche pas, vous pouvez occulter d'autres threads.Pour plus d'informations, consultez Résumé par thread (rapport).
Opérations sur disque
Cet onglet affiche les processes et les threads impliqués dans les E/S de disque pour le compte du processus actuel, quels fichiers ils ont atteints (par exemple, les DLL qui ont été chargées), le nombre d'octets lus, et d'autres informations.Vous pouvez utiliser ce rapport pour évaluer le temps passé à accéder aux fichiers pendant l'exécution, surtout si votre processus semble être lié aux E/S.Pour plus d'informations, consultez Rapport sur les opérations sur le disque (Vue Threads).