Partager via


Examiner les compteurs de performances (dotnet-counters)

Cet article s’applique à : ✔️ dotnet-counters version 3.0.47001 et versions ultérieures.

Les compteurs peuvent être lus à partir d’applications exécutant .NET 5 ou version ultérieure.

Installer

Il existe trois façons de télécharger et d’utiliser dotnet-counters:

  • Exécution ponctuelle (recommandé) :

    À compter de .NET 10.0.100, vous pouvez exécuter dotnet-counters sans installation permanente à l’aide dnxde :

    dnx dotnet-counters [options]
    

    Par exemple:

    dnx dotnet-counters monitor --process-id 1234
    

    Cette approche télécharge et exécute automatiquement la dernière version sans modifier définitivement votre système.

  • outil global dotnet :

    Pour installer la dernière version de version du dotnet-counterspackage NuGet pour une utilisation fréquente, utilisez la commande d’installation de l’outil dotnet :

    dotnet tool install --global dotnet-counters
    

    Cette commande installe un dotnet-counters fichier binaire sur votre chemin d’accès aux outils du SDK .NET, que vous pouvez ajouter à votre chemin d’accès pour appeler facilement les outils installés globalement.

  • Téléchargement direct :

    Téléchargez l’exécutable de l’outil qui correspond à votre plateforme :

    Système d''exploitation Plateforme
    Windows x86 | x64 | Bras | Arm-x64
    Linux x64 | Bras | Arm64 | musl-x64 | musl-Arm64

Notes

Pour utiliser dotnet-counters sur une application x86, vous avez besoin d’une version x86 correspondante de l’outil.

Synopsis

dotnet-counters [-h|--help] [--version] <command>

Description

dotnet-counters est un outil de surveillance des performances pour l’analyse ad hoc de l’intégrité et l’examen des performances de premier niveau. Il peut observer les valeurs de compteur de performances publiées via l’API EventCounter ou l’API Meter. Par exemple, vous pouvez surveiller rapidement des éléments tels que l’utilisation du processeur ou le taux d’exceptions levées dans votre application .NET Core pour voir s’il y a quelque chose de suspect avant de plonger dans une enquête plus sérieuse sur les performances à l’aide PerfView ou dotnet-trace.

Options

  • --version

    Affiche la version de l’utilitaire dotnet-counters .

  • -h|--help

    Affiche l’aide en ligne de commande.

Commandes

Commande
dotnet-counters collecte
Moniteur dotnet-counters
dotnet-counters ps

dotnet-counters collecte

Collectez régulièrement les valeurs de compteur sélectionnées et exportez-les dans un format de fichier spécifié pour le post-traitement.

Synopsis

dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]

Options

  • -p|--process-id <PID>

    Identifiant du processus à partir duquel collecter des données de compteur.

    Notes

    Sur Linux et macOS, l’utilisation de cette option nécessite l’application cible et dotnet-counters partage la même TMPDIR variable d’environnement. Dans le cas contraire, la commande expire.

  • -n|--name <name>

    Nom du processus à partir duquel collecter des données de compteur.

    Notes

    Sur Linux et macOS, l’utilisation de cette option nécessite l’application cible et dotnet-counters partage la même TMPDIR variable d’environnement. Dans le cas contraire, la commande expire.

  • --diagnostic-port <port-address[,(listen|connect)]>

    Définit le port de diagnostic utilisé pour communiquer avec le processus à surveiller. dotnet-counters et le runtime .NET à l’intérieur du processus cible doivent s’entendre sur l’adresse de port, avec une écoute et l’autre connexion. dotnet-counters détermine automatiquement le port approprié lors de l’attachement à l’aide des --process-id options ou --name des options, ou lors du lancement d’un processus à l’aide de l’option -- <command> . Il est généralement nécessaire de spécifier explicitement le port lors de l’attente d’un processus qui démarre à l’avenir ou communique avec un processus qui s’exécute à l’intérieur d’un conteneur qui ne fait pas partie de l’espace de noms de processus actuel.

    Le port-address système d’exploitation diffère :

    • Linux et macOS : chemin d’accès à un socket de domaine Unix tel que /foo/tool1.socket.
    • Windows : chemin d’accès à un canal nommé tel que \\.\pipe\my_diag_port1.
    • Android, iOS et tvOS - un port IP :port tel que 127.0.0.1:9000.

    Par défaut, dotnet-counters écoute à l’adresse spécifiée. Vous pouvez demander dotnet-counters à se connecter à la place en ajoutant ,connect après l’adresse. Par exemple, --diagnostic-port /foo/tool1.socket,connect vous connecterez à un processus de runtime .NET qui écoute le /foo/tool1.socket socket de domaine Unix.

    Pour plus d’informations sur l’utilisation de cette option pour démarrer la surveillance des compteurs à partir du démarrage de l’application, consultez l’utilisation du port de diagnostic.

  • --refresh-interval <SECONDS>

    Nombre de secondes à retarder entre la mise à jour des compteurs affichés

  • --counters <COUNTERS>

    Liste de compteurs séparés par des virgules. Les compteurs peuvent être spécifiés provider_name[:counter_name]. Si provider_name est utilisé sans liste éligible de compteurs, tous les compteurs du fournisseur sont affichés. Pour découvrir les noms de fournisseurs et de compteurs, consultez les métriques intégrées. Pour EventCounters, provider_name il s’agit du nom de l’EventSource et du compteur. provider_name

  • --format <csv|json>

    Format à exporter. Actuellement disponible : csv, json.

  • -o|--output <output>

    Le nom du fichier de sortie.

  • -- <command>

    Après les paramètres de configuration de collection, l’utilisateur peut ajouter -- une commande pour démarrer une application .NET. dotnet-counters lance un processus avec la commande fournie et collecte les métriques demandées. Cela est souvent utile pour collecter des métriques pour le chemin d’accès de démarrage de l’application et peut être utilisé pour diagnostiquer ou surveiller les problèmes qui se produisent tôt avant ou peu après le point d’entrée principal.

    Notes

    L’utilisation de cette option surveille le premier processus .NET qui communique à l’outil, ce qui signifie que si votre commande lance plusieurs applications .NET, elle collecte uniquement la première application. Par conséquent, il est recommandé d’utiliser cette option sur les applications autonomes ou d’utiliser l’option dotnet exec <app.dll> .

    Notes

    Si vous lancez un exécutable .NET via dotnet-counters, son entrée/sortie sera redirigé et vous ne pourrez pas interagir avec son stdin/stdout. Vous pouvez quitter l’outil via Ctrl+C ou SIGTERM pour mettre fin en toute sécurité à l’outil et au processus enfant. Si le processus enfant se termine avant l’outil, l’outil se ferme également. Si vous avez besoin d’utiliser stdin/stdout, vous pouvez utiliser l’option --diagnostic-port. Pour plus d’informations, consultez Utilisation du port de diagnostic.

Notes

Pour collecter des métriques en utilisant dotnet-counters, il faut l’exécuter en tant qu’utilisateur exécutant le processus cible ou en tant que racine. Sinon, l’outil ne parvient pas à établir une connexion avec le processus cible.

Exemples

  • Collectez tous les compteurs à un intervalle d’actualisation de 3 secondes et générez un csv en tant que sortie :

    > dotnet-counters collect --process-id 1902 --refresh-interval 3 --format csv
    
    --counters is unspecified. Monitoring System.Runtime counters by default.
    Starting a counter session. Press Q to quit.
    
  • Démarrez dotnet mvc.dll en tant que processus enfant et commencez à collecter des compteurs d’exécution et des compteurs hébergement ASP.NET Core à partir du démarrage et enregistrez-le en tant que sortie JSON :

    > dotnet-counters collect --format json --counters System.Runtime,Microsoft.AspNetCore.Hosting -- dotnet mvc.dll
    Starting a counter session. Press Q to quit.
    File saved to counter.json
    

Moniteur dotnet-counters

Affiche régulièrement les valeurs d’actualisation des compteurs sélectionnés.

Synopsis

dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]

Options

  • -p|--process-id <PID>

    Identifiant du processus à surveiller.

  • -n|--name <name>

    Nom du processus à surveiller.

  • --diagnostic-port

    Nom du port de diagnostic à créer. Consultez Utilisation du port de diagnostic pour savoir comment utiliser cette option pour démarrer la surveillance des compteurs à partir du démarrage de l’application.

  • --refresh-interval <SECONDS>

    Nombre de secondes à retarder entre la mise à jour des compteurs affichés

  • --counters <COUNTERS>

    Liste de compteurs séparés par des virgules. Les compteurs peuvent être spécifiés provider_name[:counter_name]. Si provider_name est utilisé sans liste éligible de compteurs, tous les compteurs du fournisseur sont affichés. Pour découvrir les noms de fournisseurs et de compteurs, consultez les métriques intégrées. Pour EventCounters, provider_name il s’agit du nom de l’EventSource et du compteur. provider_name

  • -- <command>

    Après les paramètres de configuration de collection, vous pouvez ajouter -- une commande pour démarrer une application .NET. dotnet-counters lance un processus avec la commande fournie et surveille les métriques demandées. Cela est souvent utile pour collecter des métriques pour le chemin d’accès de démarrage de l’application et peut être utilisé pour diagnostiquer ou surveiller les problèmes qui se produisent tôt avant ou peu après le point d’entrée principal.

    Notes

    L’utilisation de cette option surveille le premier processus .NET qui communique à l’outil, ce qui signifie que si votre commande lance plusieurs applications .NET, elle collecte uniquement la première application. Par conséquent, il est recommandé d’utiliser cette option sur les applications autonomes ou d’utiliser l’option dotnet exec <app.dll> .

    Notes

    Le lancement d’un exécutable .NET via dotnet-counters redirigera son entrée/sortie et vous ne pourrez pas interagir avec son stdin/stdout. Vous pouvez quitter l’outil via Ctrl+C ou SIGTERM pour mettre fin en toute sécurité à l’outil et au processus enfant. Si le processus enfant se termine avant l’outil, l’outil se ferme également. Si vous avez besoin d’utiliser stdin/stdout, vous pouvez utiliser l’option --diagnostic-port. Pour plus d’informations, consultez Utilisation du port de diagnostic.

Notes

Sous Linux et macOS, cette commande s’attend à ce que l’application cible et dotnet-counters partagent la même variable d’environnement TMPDIR.

Notes

Pour surveiller les métriques à l’aide de dotnet-counters, il faut l’exécuter en tant qu’utilisateur exécutant le processus cible ou en tant que racine.

Notes

Si vous voyez un message d’erreur similaire à celui suivant : [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., vous essayez d’utiliser dotnet-counters ce qui a une incompatibilité de bit par rapport au processus cible. Veillez à télécharger le nombre de bits correct de l’outil dans le lien d’installation.

Exemples

  • Surveillez tous les compteurs à partir de System.Runtime à un intervalle d’actualisation de 3 secondes :

    > dotnet-counters monitor --process-id 1902  --refresh-interval 3 --counters System.Runtime
    Press p to pause, r to resume, q to quit.
        Status: Running
    Name                                              Current Value
    [System.Runtime]
        dotnet.assembly.count ({assembly})                               115
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                                           5
            gen1                                                           1
            gen2                                                           1
        dotnet.gc.heap.total_allocated (By)                       1.6947e+08
        dotnet.gc.last_collection.heap.fragmentation.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                     348,248
            gen2                                                           0
            loh                                                           32
            poh                                                            0
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                  18,010,920
            gen2                                                   5,065,600
            loh                                                       98,384
            poh                                                    3,407,048
        dotnet.gc.last_collection.memory.committed_size (By)      66,842,624
        dotnet.gc.pause.time (s)                                           0.05
        dotnet.jit.compilation.time (s)                                    1.317
        dotnet.jit.compiled_il.size (By)                             574,886
        dotnet.jit.compiled_methods ({method})                         6,008
        dotnet.monitor.lock_contentions ({contention})                   194
        dotnet.process.cpu.count ({cpu})                                  16
        dotnet.process.cpu.time (s)
            cpu.mode
            --------
            system                                                         4.953
            user                                                           6.266
        dotnet.process.memory.working_set (By)                             1.3217e+08
        dotnet.thread_pool.queue.length ({work_item})                      0
        dotnet.thread_pool.thread.count ({thread})                       133
        dotnet.thread_pool.work_item.count ({work_item})              71,188
        dotnet.timer.count ({timer})                                     124
    

    Notes

    Si l’application utilise .NET version 8 ou inférieure, le compteur System.Runtime n’existe pas dans ces versions et dotnet-counters revient à afficher les anciens EventCounters System.Runtime à la place. L’interface utilisateur semble légèrement différente, comme illustré ici.

    [System.Runtime]
          % Time in GC since last GC (%)                                 0
          Allocation Rate (B / 1 sec)                                5,376
          CPU Usage (%)                                                  0
          Exception Count (Count / 1 sec)                                0
          GC Fragmentation (%)                                          48.467
          GC Heap Size (MB)                                              0
          Gen 0 GC Count (Count / 1 sec)                                 1
          Gen 0 Size (B)                                                24
          Gen 1 GC Count (Count / 1 sec)                                 1
          Gen 1 Size (B)                                                24
          Gen 2 GC Count (Count / 1 sec)                                 1
          Gen 2 Size (B)                                           272,000
          IL Bytes Jitted (B)                                       19,449
          LOH Size (B)                                              19,640
          Monitor Lock Contention Count (Count / 1 sec)                  0
          Number of Active Timers                                        0
          Number of Assemblies Loaded                                    7
          Number of Methods Jitted                                     166
          POH (Pinned Object Heap) Size (B)                             24
          ThreadPool Completed Work Item Count (Count / 1 sec)           0
          ThreadPool Queue Length                                        0
          ThreadPool Thread Count                                        2
          Working Set (MB)                                              19
    
  • Surveillez simplement les garbage collections et l’allocation de tas de garbage collection à partir de System.Runtime:

    > dotnet-counters monitor --process-id 1902 --counters System.Runtime[dotnet.gc.collections,dotnet.gc.heap.total_allocated]
    
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                                  Current Value
    [System.Runtime]
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                0
            gen1                                0
            gen2                                0
        dotnet.gc.heap.total_allocated (By)     9,943,384
    
    
  • Surveillez les valeurs EventCounter des EventSource définis par l’utilisateur. Pour plus d’informations, consultez Tutoriel : Mesurer les performances à l’aide d’EventCounters dans .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Lancez my-aspnet-server.exe et surveillez le nombre d’assemblys chargés à partir de son démarrage :

    > dotnet-counters monitor --counters System.Runtime[dotnet.assembly.count] -- my-aspnet-server.exe
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                               Current Value
    [System.Runtime]
    dotnet.assembly.count ({assembly})      11
    
  • Lancez my-aspnet-server.exe avec arg1 et arg2 en tant qu’arguments de ligne de commande et surveillez son jeu de travail et sa taille de tas GC à partir de son démarrage :

    > dotnet-counters monitor --counters System.Runtime[dotnet.process.memory.working_set,dotnet.gc.last_collection.heap.size] -- my-aspnet-server.exe arg1 arg2
    
    Name                                             Current Value
    [System.Runtime]
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                          560
            gen1                                      462,720
            gen2                                            0
            loh                                             0
            poh                                         8,184
        dotnet.process.memory.working_set (By)     48,431,104
    
    

dotnet-counters ps

Répertorie les processus dotnet qui peuvent être surveillés par dotnet-counters. dotnet-counters La version 6.0.320703 et ultérieure affiche également les arguments de ligne de commande que chaque processus a démarré, le cas échéant.

Synopsis

dotnet-counters ps [-h|--help]

Exemple

Supposons que vous démarriez une application de longue durée à l’aide de la commande dotnet run --configuration Release. Dans une autre fenêtre, vous exécutez la commande dotnet-counters ps . La sortie que vous voyez est la suivante. Les arguments de ligne de commande, le cas échéant, sont affichés dans dotnet-counters version 6.0.320703 et ultérieures.

> dotnet-counters ps

  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

Utilisation du port de diagnostic

Le port de diagnostic est une fonctionnalité d’exécution qui vous permet de démarrer la surveillance ou de collecter des compteurs à partir du démarrage de l’application. Pour ce dotnet-countersfaire, vous pouvez utiliser dotnet-counters <collect|monitor> -- <command> comme décrit dans les exemples précédents ou utiliser l’option --diagnostic-port .

L’utilisation de dotnet-counters <collect|monitor> -- <command> pour lancer l’application en tant que processus enfant est le moyen le plus simple de le surveiller rapidement à partir de son démarrage.

Toutefois, lorsque vous souhaitez obtenir un contrôle plus fin sur la durée de vie de l’application surveillée (par exemple, surveiller l’application pendant les 10 premières minutes uniquement et continuer à s’exécuter) ou si vous devez interagir avec l’application à l’aide de l’interface CLI, l’option --diagnostic-port vous permet de contrôler à la fois l’application cible en cours d’analyse et dotnet-counters.

  1. La commande suivante crée dotnet-counters un socket de diagnostic nommé myport.sock et attend une connexion.

    dotnet-counters collect --diagnostic-port myport.sock
    

    Sortie :

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. Dans une console distincte, lancez l’application cible avec la variable d’environnement DOTNET_DiagnosticPorts définie sur la valeur dans la sortie dotnet-counters.

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    Cela permet dotnet-counters de commencer à collecter des compteurs sur my-dotnet-app:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock
    Starting a counter session. Press Q to quit.
    

    Important

    Le lancement de votre application peut dotnet run poser problème, car l’interface CLI dotnet peut générer de nombreux processus enfants qui ne sont pas votre application et auxquels elles peuvent se connecter dotnet-counters avant votre application, laissant votre application suspendue au moment de l’exécution. Il est recommandé d’utiliser directement une version autonome de l’application ou dotnet exec de lancer l’application.