utilitaire d’analyse des performances dotnet-trace
Cet article s’applique à : ✔️ dotnet-trace
3.0.47001 et versions ultérieures
Installer
Il existe deux façons de télécharger et d’installer dotnet-trace
:
outil global dotnet :
Pour installer la dernière version de version du
dotnet-trace
package NuGet, utilisez la commande installation de l’outil dotnet :dotnet tool install --global dotnet-trace
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 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Synopsis
dotnet-trace [-h, --help] [--version] <command>
Description
L’outil dotnet-trace
:
- Est un outil .NET Core multiplateforme.
- Active la collecte des traces .NET Core dans un processus en cours d’exécution sans profileur natif.
- Repose sur
EventPipe
du runtime .NET Core. - Offre la même expérience sur Windows, Linux ou macOS.
Options
-h|--help
Affiche l’aide en ligne de commande.
--version
Affiche la version de l’utilitaire dotnet-trace.
--duration
Durée d’exécution de la trace.
--duration 00:00:00:05
l’exécutera pendant 5 secondes.
Commandes
Commande |
---|
dotnet-trace collect |
dotnet-trace convert |
dotnet-trace ps |
dotnet-trace list-profiles |
rapport dotnet-trace |
dotnet-trace collect
Collecte une trace de diagnostic à partir d’un processus en cours d’exécution ou lance un processus enfant et le trace (.NET 5 ou version ultérieure). Pour que l’outil exécute un processus enfant et le trace à partir de son démarrage, ajoutez --
à la commande collect.
Synopsis
dotnet-trace collect [--buffersize <size>] [--clreventlevel <clreventlevel>] [--clrevents <clrevents>]
[--format <Chromium|NetTrace|Speedscope>] [-h|--help] [--duration dd:hh:mm:ss]
[-n, --name <name>] [--diagnostic-port] [-o|--output <trace-file-path>] [-p|--process-id <pid>]
[--profile <profile-name>] [--providers <list-of-comma-separated-providers>]
[-- <command>] (for target applications running .NET 5 or later)
[--show-child-io] [--resume-runtime]
[--stopping-event-provider-name <stoppingEventProviderName>]
[--stopping-event-event-name <stoppingEventEventName>]
[--stopping-event-payload-filter <stoppingEventPayloadFilter>]
Options
--buffersize <size>
Définit la taille de la mémoire tampon en mémoire, en mégaoctets. Valeur par défaut = 256 Mo.
Notes
Si le processus cible émet des événements plus rapidement qu’ils ne peuvent être écrits sur le disque, cette mémoire tampon peut dépasser la capacité et certains événements seront supprimés. Vous pouvez atténuer ce problème en augmentant la taille de la mémoire tampon ou en réduisant le nombre d’événements enregistrés.
--clreventlevel <clreventlevel>
Détail des événements CLR à émettre. Le tableau suivant présente les niveaux d’événements disponibles.
Valeur de chaîne Valeur numérique logalways
0
critical
1
error
2
warning
3
informational
4
verbose
5
--clrevents <clrevents>
Liste des mots clés du fournisseur d’exécution CLR permettant d’activer des signes séparés par des
+
. Il s’agit d’un mappage simple qui vous permet de spécifier des mots clés d’événement via des alias de chaîne plutôt que par leurs valeurs hexadécimales. Par exemple,dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4
demande le même ensemble d’événements quedotnet-trace collect --clrevents gc+gchandle --clreventlevel informational
. Le tableau ci-dessous présente la liste des mots clés disponibles :Alias de chaîne de mot clé Valeur hexadécimale du mot clé gc
0x1
gchandle
0x2
fusion
0x4
loader
0x8
jit
0x10
ngen
0x20
startenumeration
0x40
endenumeration
0x80
security
0x400
appdomainresourcemanagement
0x800
jittracing
0x1000
interop
0x2000
contention
0x4000
exception
0x8000
threading
0x10000
jittedmethodiltonativemap
0x20000
overrideandsuppressngenevents
0x40000
type
0x80000
gcheapdump
0x100000
gcsampledobjectallocationhigh
0x200000
gcheapsurvivalandmovement
0x400000
gcheapcollect
0x800000
gcheapandtypenames
0x1000000
gcsampledobjectallocationlow
0x2000000
perftrack
0x20000000
stack
0x40000000
threadtransfer
0x80000000
debugger
0x100000000
monitoring
0x200000000
codesymbols
0x400000000
eventsource
0x800000000
compilation
0x1000000000
compilationdiagnostic
0x2000000000
methoddiagnostic
0x4000000000
typediagnostic
0x8000000000
Vous pouvez en savoir plus sur le fournisseur CLR plus en détail dans la documentation de référence du fournisseur d’exécution .NET.
--format {Chromium|NetTrace|Speedscope}
Définit le format de sortie de la conversion du fichier de trace. Par défaut, il s’agit de
NetTrace
.-n, --name <name>
Nom du processus à partir duquel collecter la trace.
--diagnostic-port <path-to-port>
Nom du port de diagnostic à créer. Consultez Utiliser le port de diagnostic pour collecter une trace à partir du démarrage de l’application pour apprendre à utiliser cette option afin de collecter une trace à partir du démarrage de l’application.
--duration <time-to-run>
Heure de l’exécution de la trace. Utilisez le format
dd:hh:mm:ss
. Par exemple00:00:00:05
l’exécutera pendant 5 secondes.-o|--output <trace-file-path>
Chemin d’accès de sortie pour les données de trace collectées. Si aucune valeur n’est spécifiée,
<appname>_<yyyyMMdd>_<HHmmss>.nettrace
est utilisé par défaut, par exemple « myapp_20210315_111514.nettrace ».-p|--process-id <PID>
ID de processus à partir duquel collecter la trace.
--profile <profile-name>
Ensemble prédéfini nommé de configurations de fournisseur qui permet aux scénarios de suivi courants d’être spécifiés succinctement. Les profils suivants sont disponibles :
Profil | Description |
---|---|
cpu-sampling |
Utile pour le suivi de l’utilisation du processeur et des informations générales sur le runtime .NET. Il s’agit de l’option par défaut si aucun profil ou fournisseur n’est spécifié. |
gc-verbose |
Effectue le suivi des collections GC et échantillonne des allocations d’objets. |
gc-collect |
Effectue le suivi des collections GC uniquement à une charge très faible. |
--providers <list-of-comma-separated-providers>
Liste séparée par des virgules des fournisseurs
EventPipe
à activer. Ces fournisseurs complètent tous les fournisseurs découlant de--profile <profile-name>
. S’il existe une incohérence pour un fournisseur spécifique, cette configuration est prioritaire sur la configuration implicite du profil.Cette liste de fournisseurs se présente sous la forme suivante :
Provider[,Provider]
Provider
a la forme suivante :KnownProviderName[:Flags[:Level][:KeyValueArgs]]
.KeyValueArgs
a la forme suivante :[key1=value1][;key2=value2]
.
Pour en savoir plus sur certains fournisseurs connus dans .NET, reportez-vous aux fournisseurs d’événements connus.
-- <command>
(pour les applications cibles exécutant .NET 5 ou version ultérieure)Après les paramètres de configuration de collection, l’utilisateur peut ajouter
--
, suivi d’une commande pour démarrer une application .NET avec au moins un runtime 5.0. Cela peut être utile lors du diagnostic des problèmes qui se produisent au début du processus, tels que le problème de performances de démarrage ou le chargeur d’assembly et les erreurs de classeur.Remarque
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>
.--show-child-io
Affiche les flux d’entrée et de sortie d’un processus enfant lancé dans la console actuelle.
--resume-runtime
Reprendre le runtime une fois que la session a été initialisée, la valeur par défaut est true. Désactivez la reprise du runtime à l’aide de --resume-runtime:false.
--stopping-event-provider-name
Chaîne, analysée en l’état, qui arrête la trace lorsqu’elle atteint un événement avec le nom du fournisseur correspondant. Pour un événement d’arrêt plus spécifique, fournissez
--stopping-event-event-name
et/ou--stopping-event-payload-filter
. Par exemple,--stopping-event-provider-name Microsoft-Windows-DotNETRuntime
pour arrêter la trace à l’atteinte du premier événement émis par le fournisseur d’événementsMicrosoft-Windows-DotNETRuntime
.--stopping-event-event-name
Chaîne, analysée en l’état, qui arrête la trace lorsqu’elle atteint un événement avec le nom de l’événement correspondant.
--stopping-event-provider-name
doit être défini. Pour un événement d’arrêt plus spécifique, fournissez--stopping-event-payload-filter
. Par exemple,--stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted
pour arrêter la trace à l’atteinte du premier événementMethod/JittingStarted
émis par le fournisseur d’événementsMicrosoft-Windows-DotNETRuntime
.--stopping-event-payload-filter
Chaîne, analysée en tant que paires [payload_field_name]:[payload_field_value] séparées par des virgules, ce qui arrête la trace à l’atteinte d’un événement contenant toutes les paires de charges utiles spécifiées. Nécessite que
--stopping-event-provider-name
et--stopping-event-event-name
soient définis. Par exemple,--stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted --stopping-event-payload-filter MethodNameSpace:Program,MethodName:OnButtonClick
pour arrêter la trace lors du premier événementMethod/JittingStarted
de la méthodeOnButtonClick
dans l’espace de nomsProgram
émis par le fournisseur d’événementsMicrosoft-Windows-DotNETRuntime
.
Remarque
- L’arrêt de la trace peut prendre beaucoup de temps (jusqu’à quelques minutes) pour les applications volumineuses. Le runtime doit envoyer le cache type pour tout le code managé capturé dans la trace.
- Sur Linux et macOS, cette commande attend l’application cible et
dotnet-trace
pour partager la même variable d’environnementTMPDIR
. Dans le cas contraire, la commande expire.
- Pour collecter une trace à l’aide de
dotnet-trace
, il doit être exécuté en tant que même utilisateur que l’utilisateur exécutant le processus cible ou en tant que racine. Sinon, l’outil ne parvient pas à établir une connexion avec le processus cible.
- Si vous rencontrez une exception non gérée lors de l’exécution
dotnet-trace collect
, cela entraîne une trace incomplète. Si trouver la cause racine de l’exception est votre priorité, accédez à Collecter les vidages en cas d’incident. En raison de l’exception non gérée, la trace est tronquée lorsque le runtime s’arrête pour empêcher tout autre comportement non souhaité, tel qu’un blocage ou une altération des données. Même si la trace est incomplète, vous pouvez toujours l’ouvrir pour voir ce qui a mené à l’échec. Toutefois, il manquera des informations d’exécution (cela se produit à la fin d’une trace) afin que les piles puissent être non résolues (en fonction des fournisseurs activés). Ouvrez la trace en exécutant PerfView avec l’indicateur/ContinueOnError
sur la ligne de commande. Les journaux contiennent également l’emplacement où l’exception a été déclenchée.
- Lors de la spécification d’un événement d’arrêt via les options
--stopping-event-*
, car l’EventStream est analysé de manière asynchrone, certains événements passent entre le moment où un événement de trace correspondant aux options d’événement d’arrêt spécifiées est analysé et l’EventPipeSession est arrêtée.
dotnet-trace convert
Convertit les traces nettrace
en formats alternatifs à utiliser avec des outils d’analyse de trace alternatifs.
Synopsis
dotnet-trace convert [<input-filename>] [--format <Chromium|NetTrace|Speedscope>] [-h|--help] [-o|--output <output-filename>]
Arguments
<input-filename>
Entrez un fichier de trace à convertir. La valeur par défaut est trace.nettrace.
Options
--format <Chromium|NetTrace|Speedscope>
Définit le format de sortie de la conversion du fichier de trace.
-o|--output <output-filename>
Nom de fichier de sortie. L’extension du format cible va être ajoutée.
Notes
La conversion de fichiers nettrace
en fichiers chromium
ou speedscope
est irréversible. Les fichiers speedscope
et chromium
ne disposent pas de toutes les informations nécessaires pour reconstruire des fichiers nettrace
. Toutefois, la commande convert
conserve le fichier nettrace
d’origine. Ne supprimez donc pas ce fichier si vous envisagez de l’ouvrir ultérieurement.
dotnet-trace ps
Répertorie les processus dotnet à partir desquels les traces peuvent être collectées.
dotnet-trace
6.0.320703 et versions ultérieures, affiche également les arguments de ligne de commande avec lequel chaque processus a démarré, le cas échéant.
Remarque
Pour obtenir des informations complètes pour les processus 64 bits énumérés, vous devez utiliser une version 64 bits de l’outil dotnet-trace
.
Synopsis
dotnet-trace 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-trace ps
. La sortie que vous verrez est la suivante. Les arguments de ligne de commande, le cas échéant, sont affichés dans dotnet-trace
version 6.0.320703 et ultérieures.
> dotnet-trace ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-trace list-profiles
Répertorie les profils de suivi prédéfini avec une description des fournisseurs et des filtres dans chaque profil.
Synopsis
dotnet-trace list-profiles [-h|--help]
dotnet-trace report
Crée un rapport dans stdout à partir d’une trace générée précédemment.
Synopsis
dotnet-trace report [-h|--help] <tracefile> [command]
Arguments
<tracefile>
Chemin d’accès du fichier pour la trace en cours d’analyse.
Commandes
dotnet-trace report topN
Recherche les principales méthodes N qui se trouvent sur la pile d’appels la plus longue.
Synopsis
dotnet-trace report <tracefile> topN [-n|--number <n>] [--inclusive] [-v|--verbose] [-h|--help]
Options
-n|--number <n>
Donne les méthodes N principales sur la pile d’appels.
--inclusive
Affichez les principales méthodes N en fonction du temps inclusif. Si ce paramètre n’est pas précisé, le temps exclusif est utilisé par défaut.
-v|--verbose
Affichez les paramètres de chaque méthode dans leur totalité. Si ce paramètre n’est pas précisé, les paramètres sont tronqués.
Collecter une trace avec dotnet-trace
Pour collecter des traces à l’aide de dotnet-trace
:
Obtenez l’identificateur de processus (PID) de l’application .NET Core à partir duquel collecter les traces.
- Sur Windows, vous pouvez utiliser le Gestionnaire des tâches ou la commande
tasklist
, par exemple. - Sur Linux, par exemple, la commande
ps
. - dotnet-trace ps
- Sur Windows, vous pouvez utiliser le Gestionnaire des tâches ou la commande
Exécutez la commande suivante :
dotnet-trace collect --process-id <PID>
La commande précédente génère une sortie similaire à ce qui suit :
Press <Enter> to exit... Connecting to process: <Full-Path-To-Process-Being-Profiled>/dotnet.exe Collecting to file: <Full-Path-To-Trace>/trace.nettrace Session Id: <SessionId> Recording trace 721.025 (KB)
Arrêtez la collecte en appuyant sur la touche
<Enter>
.dotnet-trace
termine la journalisation des événements dans le fichier trace.nettrace .
Lancer une application enfant et collecter une trace à partir de son démarrage à l’aide de dotnet-trace
Parfois, il peut être utile de collecter une trace d’un processus à partir de son démarrage. Pour les applications exécutant .NET 5 ou une version ultérieure, il est possible de le faire à l’aide de dotnet-trace.
Cela lance hello.exe
avec arg1
et arg2
en tant qu’arguments de ligne de commande et collecte une trace à partir du démarrage de son runtime :
dotnet-trace collect -- hello.exe arg1 arg2
La commande précédente génère une sortie similaire à ce qui suit :
No profile or providers specified, defaulting to trace profile 'cpu-sampling'
Provider Name Keywords Level Enabled By
Microsoft-DotNETCore-SampleProfiler 0x0000F00000000000 Informational(4) --profile
Microsoft-Windows-DotNETRuntime 0x00000014C14FCCBD Informational(4) --profile
Process : E:\temp\gcperfsim\bin\Debug\net5.0\gcperfsim.exe
Output File : E:\temp\gcperfsim\trace.nettrace
[00:00:00:05] Recording trace 122.244 (KB)
Press <Enter> or <Ctrl+C> to exit...
Vous pouvez arrêter de collecter la trace en appuyant sur la touche <Enter>
ou <Ctrl + C>
. Cette opération fermera également hello.exe
.
Notes
Le lancement de hello.exe
via dotnet-trace redirigera son entrée/sortie et vous ne pourrez pas interagir avec elle sur la console par défaut. Utilisez le commutateur --show-child-io
pour interagir avec son stdin/stdout.
La sortie de l’outil via CTRL+C ou SIGTERM met 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 et la trace doit être visible en toute sécurité.
Utiliser le port de diagnostic pour collecter une trace à partir du démarrage de l’application
Le port de diagnostic est une fonctionnalité d’exécution ajoutée dans .NET 5 qui vous permet de démarrer le suivi à partir du démarrage de l’application. Pour y parvenir en utilisant dotnet-trace
, vous pouvez utiliser dotnet-trace collect -- <command>
comme décrit dans les exemples ci-dessus ou utiliser l’option --diagnostic-port
.
L’utilisation de dotnet-trace <collect|monitor> -- <command>
pour lancer l’application en tant que processus enfant est le moyen le plus simple de suivre rapidement l’application à partir de son démarrage.
Toutefois, lorsque vous souhaitez obtenir un contrôle plus fin sur la durée de vie de l’application en cours de suivi (par exemple, surveiller l’application pendant les 10 premières minutes uniquement et poursuivre son exécution) 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-trace
.
La commande ci-dessous fait en sorte que
dotnet-trace
crée un socket de diagnostic nommémyport.sock
et attend une connexion.dotnet-trace 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
Dans une console distincte, lancez l’application cible avec la variable d’environnement
DOTNET_DiagnosticPorts
définie sur la valeur dans la sortiedotnet-trace
.export DOTNET_DiagnosticPorts=/home/user/myport.sock ./my-dotnet-app arg1 arg2
Cela doit ensuite permettre à
dotnet-trace
de démarrer le suivi demy-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 avec
dotnet run
peut poser problème, car l’interface CLI dotnet peut générer de nombreux processus enfants qui ne sont pas votre application. Ils peuvent se connecter àdotnet-trace
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 d’utiliserdotnet exec
pour lancer l’application.
Afficher la trace capturée à partir de dotnet-trace
Sur Windows, vous pouvez afficher les fichiers .nettrace dans Visual Studio ou PerfView à des fins d’analyse.
Sur Linux, vous pouvez afficher la trace en modifiant le format de sortie de dotnet-trace
à speedscope
. Modifiez le format du fichier de sortie à l’aide de l’option -f|--format
. Vous pouvez choisir entre nettrace
(l’option par défaut) et speedscope
. L’option -f speedscope
fera en sorte que dotnet-trace
génère un fichier speedscope
. Les fichiers Speedscope
peuvent être ouverts sur https://www.speedscope.app.
Pour les traces collectées sur des plateformes autres que Windows, vous pouvez également déplacer le fichier de trace vers une machine Windows et l’afficher dans Visual Studio ou PerfView.
Notes
Le runtime .NET Core génère des traces au format nettrace
. Les traces sont converties en speedscope (si elles sont spécifiées), une fois la trace terminée. Étant donné que certaines conversions peuvent entraîner une perte de données, le fichier nettrace
d’origine est conservé en regard du fichier converti.
Utiliser le fichier .rsp pour éviter de taper des commandes longues
Vous pouvez lancer dotnet-trace
avec un fichier .rsp
qui contient les arguments à passer. Cela peut être utile lors de l’activation des fournisseurs qui s’attendent à des arguments longs ou lors de l’utilisation d’un environnement d’interpréteur de commandes qui supprime les caractères.
Par exemple, le fournisseur suivant peut être fastidieux à taper chaque fois que vous souhaitez effectuer le suivi :
dotnet-trace collect --providers Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider
En outre, l’exemple précédent contient "
comme élément de l’argument. Étant donné que les guillemets ne sont pas gérés de manière égale par chaque interpréteur de commandes, vous pouvez rencontrer différents problèmes lors de l’utilisation de différents interpréteurs de commandes. Par exemple, la commande à entrer dans zsh
est différente de la commande dans cmd
.
Au lieu de taper cela à chaque fois, vous pouvez enregistrer le texte suivant dans un fichier appelé myprofile.rsp
.
--providers
Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider
Une fois que vous avez enregistré myprofile.rsp
, vous pouvez lancer dotnet-trace
avec cette configuration à l’aide de la commande suivante :
dotnet-trace @myprofile.rsp