Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article s’applique à : ✔️ Kit de développement logiciel (SDK) .NET Core 2.1 et versions ultérieures
Lorsque des problèmes de performances sont rencontrés sous Linux, la collecte d’une trace peut perfcollect être utilisée pour recueillir des informations détaillées sur ce qui se passait sur la machine au moment du problème de performances.
perfcollect est un script bash qui utilise Linux Trace Toolkit : next generation (LTTng) pour collecter les événements écrits à partir du runtime ou de n’importe quel EventSource, ainsi que perf pour collecter des échantillons de processeur du processus cible.
Préparer votre machine
Suivez ces étapes pour préparer votre ordinateur à collecter une trace de performances avec perfcollect.
Remarque
Si vous effectuez une capture à partir de l’intérieur d’un conteneur, celui-ci doit disposer des fonctionnalités appropriées. Les capacités minimales requises sont PERFMON et SYS_PTRACE. Si la capture échoue avec l’ensemble minimal, ajoutez la SYS_ADMIN fonctionnalité au conteneur. Pour plus d’informations sur le suivi des applications à l’intérieur des conteneurs à l’aide de PerfCollect, consultez Collecter les diagnostics dans les conteneurs.
Téléchargez
perfcollect.curl -OL https://aka.ms/perfcollectRendez le script exécutable.
chmod +x perfcollectInstallez les conditions préalables au suivi : il s’agit des bibliothèques de suivi réelles.
sudo ./perfcollect installCela installera les prérequis suivants sur votre machine :
-
perf: le sous-système d’événements de performance Linux et l’application de collection/visionneuse en mode utilisateur associée.perffait partie du code source du noyau Linux, mais n’est généralement pas installé par défaut. -
LTTng: utilisé pour capturer les données d’événement émises au moment de l’exécution par CoreCLR. Ces données sont ensuite utilisées pour analyser le comportement de divers composants d’exécution tels que le GC, le JIT et le pool de threads.
-
Les versions récentes de .NET Core et de l’outil de performance Linux prennent en charge la résolution automatique des noms de méthode pour le code de l’infrastructure.
Pour résoudre les noms de méthode des DLL d’exécution natives (telles que libcoreclr.so), perfcollect résoudra les symboles correspondants lors de la conversion des données, mais uniquement si les symboles de ces fichiers binaires sont présents. Pour plus d’informations, consultez la section Obtention de symboles pour le runtime natif .
Collecter une trace
Disposer de deux interpréteurs de commandes : l’un pour contrôler le traçage, appelé [Trace], et l’autre pour l’exécution de l’application, appelé [App].
[Trace] Démarrer la collecte.
sudo ./perfcollect collect sampleTraceSortie attendue :
Collection started. Press CTRL+C to stop.Remarque
LTTng a connu un changement radical entre les versions 2.12 et 2.13. Le runtime .NET prend actuellement en charge la version 2.12. Si votre distribution Linux a adopté la version 2.13 ou ultérieure, nous vous recommandons de désactiver la partie LTTng de la fonctionnalité perfcollect. Pour ce faire, ajoutez l’option '-nolttng' à la ligne de commande perfcollect et, à l’étape 3, ne définissez pas la variable d’environnement DOTNET_EnableEventLog.
[Appli] Configurez l’interpréteur de commandes de l’application avec les variables d’environnement suivantes : cela permet la configuration du suivi de CoreCLR.
[Appli] Configurez l’interpréteur de commandes de l’application avec les variables d’environnement suivantes : cela permet la configuration du suivi de CoreCLR.
export DOTNET_PerfMapEnabled=1 export DOTNET_EnableEventLog=1Remarque
Lors de l’exécution de l’application avec .NET 7, vous devez également définir
DOTNET_EnableWriteXorExecute=0en plus des variables d’environnement précédentes. Par exemple:export DOTNET_EnableWriteXorExecute=0[Appli] Exécutez l’application : laissez-la s’exécuter aussi longtemps que nécessaire afin de capturer le problème de performances. La durée exacte peut être aussi courte que nécessaire, à condition qu’elle capture suffisamment la fenêtre de temps où le problème de performances que vous souhaitez examiner se produit.
dotnet run[Trace] Arrêter la collecte - appuyez sur Ctrl+C.
^C ...STOPPED. Starting post-processing. This may take some time. Generating native image symbol files ...SKIPPED Saving native symbols ...FINISHED Exporting perf.data file ...FINISHED Compressing trace files ...FINISHED Cleaning up artifacts ...FINISHED Trace saved to sampleTrace.trace.zipLe fichier de trace compressé est maintenant stocké dans le répertoire de travail actuel.
Afficher une trace
Il existe un certain nombre d’options pour afficher la trace qui a été collectée. Il est préférable d’afficher les traces à l’aide de PerfView sous Windows, mais elles peuvent être visualisées directement sous Linux à l’aide de PerfCollect lui-même ou TraceCompassde .
Utilisez PerfCollect pour afficher le fichier de trace
Vous pouvez utiliser perfcollect lui-même pour afficher la trace que vous avez collectée. Pour ce faire, utilisez la commande suivante :
./perfcollect view sampleTrace.trace.zip
Par défaut, la trace CPU de l’application à l’aide perfde .
Pour consulter les événements qui ont été collectés via LTTng, vous pouvez passer le drapeau -viewer lttng pour voir les événements individuels :
./perfcollect view sampleTrace.trace.zip -viewer lttng
Cela utilisera babeltrace le visualiseur pour imprimer la charge utile des événements :
# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }
Utilisez PerfView pour ouvrir le fichier de trace
Pour afficher une vue agrégée de l’échantillon de processeur et des événements, vous pouvez l’utiliser PerfView sur un ordinateur Windows.
Copiez le fichier trace.zip de Linux vers une machine Windows.
Télécharger PerfView à partir de https://aka.ms/perfview.
Exécuter PerfView.exe
PerfView.exe <path to trace.zip file>
PerfView affichera la liste des vues prises en charge en fonction des données contenues dans le fichier de trace.
- Pour les investigations de CPU, choisissez Piles de CPU.
- Pour obtenir des informations détaillées sur GC, choisissez GCStats.
- Pour obtenir des informations JIT par processus/module/méthode, choisissez JITStats.
- S’il n’existe pas de vue pour les informations dont vous avez besoin, vous pouvez essayer de rechercher les événements dans la vue des événements bruts. Choisissez Événements.
Pour plus d’informations sur l’interprétation des vues dans PerfView, consultez les liens d’aide dans la vue elle-même, ou dans la fenêtre principale de PerfView, choisissez Guide de> l’utilisateur.
Remarque
Les événements écrits via System.Diagnostics.Tracing.EventSource l’API (y compris les événements de Framework) ne s’afficheront pas sous le nom de leur fournisseur. Au lieu de cela, ils sont écrits en tant qu’événements EventSourceEvent sous Microsoft-Windows-DotNETRuntime le fournisseur et leurs charges utiles sont sérialisées JSON.
Remarque
Si vous observez [unknown] /memfd:doublemapper des trames dans les noms de méthodes et les piles d’appels, définissez-les DOTNET_EnableWriteXorExecute=0 avant l’exécution de l’application que vous tracez avec perfcollect.
Utilisez TraceCompass pour ouvrir le fichier de trace
Eclipse TraceCompass est une autre option que vous pouvez utiliser pour afficher les traces.
TraceCompass fonctionne également sur les machines Linux, vous n’avez donc pas besoin de déplacer votre trace vers une machine Windows.
TraceCompass Pour ouvrir votre fichier de trace, vous devrez le décompresser.
unzip myTrace.trace.zip
perfcollect enregistrera la trace LTTng qu’il a collectée dans un format de fichier CTF dans un sous-répertoire de l' lttngTrace. Plus précisément, le fichier CTF se trouve dans un répertoire qui ressemble à lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.
Vous pouvez ouvrir le fichier de trace CTF en TraceCompass sélectionnant File -> Open Trace et en sélectionnant le metadata fichier.
Pour plus de détails, veuillez vous référer à la TraceCompass documentation.
Obtenir des symboles pour le runtime natif
La plupart du temps, vous êtes intéressé par votre propre code, qui perfcollect se résout par défaut. Parfois, il est utile de voir ce qui se passe à l’intérieur des DLL .NET (c’est le sujet de la dernière section), mais parfois ce qui se passe dans les DLL d’exécution natives (généralement libcoreclr.so) est intéressant.
perfcollect résoudra les symboles de ceux-ci lorsqu’il convertira ses données, mais uniquement si les symboles de ces DLL natives sont présents (et se trouvent à côté de la bibliothèque à laquelle elles sont destinées).
Il existe une commande globale appelée dotnet-symbol qui fait cela. Pour utiliser dotnet-symbol pour obtenir des symboles d’exécution natifs :
Installez
dotnet-symbol:dotnet tool install -g dotnet-symbolTéléchargez les symboles. Si votre version installée du runtime .NET Core est 2.1.0, la commande pour ce faire est la suivante :
mkdir mySymbols dotnet symbol --symbols --output mySymbols /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.soCopiez les symboles au bon endroit.
sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0Si cela ne peut pas être fait parce que vous n’avez pas d’accès en écriture au répertoire approprié, vous pouvez l’utiliser
perf buildid-cachepour ajouter les symboles.
Après cela, vous devriez obtenir des noms symboliques pour les dll natives lorsque vous exécutez perfcollect.
Collecte dans un conteneur Docker
Pour plus d’informations sur l’utilisation perfcollect dans les environnements de conteneurs, consultez Collecter des diagnostics dans les conteneurs.
En savoir plus sur les options de collecte
Vous pouvez spécifier les indicateurs facultatifs suivants pour perfcollect mieux répondre à vos besoins en matière de diagnostic.
Collecte pour une durée déterminée
Lorsque vous souhaitez collecter une trace pour une durée spécifique, vous pouvez utiliser -collectsec l’option suivie d’un nombre spécifiant le nombre total de secondes pour lesquelles collecter une trace.
Collecter des traces threadtime
La spécification -threadtime de avec perfcollect vous permet de collecter des données d’utilisation du processeur par thread. Cela vous permet d’analyser où chaque thread passait son temps CPU.
Collecter des traces pour la mémoire gérée et les performances du ramasse-miettes
Les options suivantes vous permettent de collecter spécifiquement les événements GC à partir du runtime.
perfcollect collect -gccollectonly
Ne collectez qu’un ensemble minimal d’événements de la Collection GC. Il s’agit du profil de collecte d’événements GC le moins verbeux qui a le moins d’impact sur les performances de l’application cible. Cette commande est analogue à celle de PerfView.exe /GCCollectOnly collect PerfView.
perfcollect collect -gconly
Collectez davantage d’événements de collection GC détaillés avec les événements JIT, Loader et Exception. Cela nécessite des événements plus détaillés (tels que les informations d’allocation et les informations de jointure GC) et aura plus d’impact sur le rendement de l’application cible que -gccollectonly l’option. Cette commande est analogue à celle de PerfView.exe /GCOnly collect PerfView.
perfcollect collect -gcwithheap
Collectez les événements de collection GC les plus verbeux, qui suivent également la survie et les mouvements du tas. Cela permet une analyse approfondie du comportement du GC, mais entraîne des coûts de performance élevés, car chaque GC peut prendre plus de deux fois plus de temps. Il est recommandé de comprendre l’impact sur les performances de l’utilisation de cette option de traçage lors du traçage dans des environnements de production.