Collecter les diagnostics dans les conteneurs
Les mêmes outils de diagnostic qui sont utiles pour diagnostiquer les problèmes .NET Core dans d’autres scénarios fonctionnent également dans les conteneurs Docker. Toutefois, certains outils nécessitent des étapes spéciales pour fonctionner dans un conteneur. Cet article explique comment les outils de collecte de traces de performances et de collecte des images mémoires peuvent être utilisés dans les conteneurs Docker.
Utilisation des outils CLI .NET dans un conteneur
Ces outils s’appliquent à : ✔️ SDK .NET Core 3.1 et versions ultérieures
Les outils de diagnostic globaux CLI .NET Core (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor et dotnet-trace) sont conçus pour fonctionner dans des environnements très divers et doivent tous fonctionner directement dans des conteneurs Docker. Pour cette raison, ces outils sont la méthode privilégiée pour collecter des informations de diagnostic pour les scénarios .NET Core ciblant .NET Core 3.1 ou version ultérieure dans les conteneurs.
Vous pouvez également installer ces outils sans le SDK .NET en téléchargeant les variantes de fichier unique à partir des liens du paragraphe précédent. Ces installations nécessitent une installation globale du runtime .NET version 3.1 ou ultérieure, que vous pouvez acquérir en suivant l’une des méthodes prescrites dans la documentation d’installation de .NET ou en consommant l’un des conteneurs d’exécution officiels.
Utilisation des outils CLI globaux .NET Core dans un conteneur side-car
Si vous souhaitez utiliser les outils de diagnostic CLI globaux .NET Core pour diagnostiquer les processus dans un autre conteneur, gardez à l’esprit les exigences supplémentaires suivantes :
- Les conteneurs doivent partager un espace de noms de processus (afin que les outils du conteneur side-car puissent accéder aux processus dans le conteneur cible).
- Les outils de diagnostic CLI globaux .NET Core ont besoin d’accéder aux fichiers que le runtime .NET Core écrit dans le répertoire /tmp. Le répertoire /tmp doit donc être partagé entre le conteneur cible et le conteneur side-car via un montage de volume. Par exemple, les conteneurs peuvent partager un volume commun ou un volumeKubernetes emptyDir pour réaliser ceci. Si vous essayez d’utiliser les outils de diagnostic à partir d’un conteneur side-car sans partager le répertoire /tmp, vous obtenez une erreur concernant le processus « runtime .NET compatible non exécuté ».
Utilisation de l’outil PerfCollect
dans un conteneur
Cet article s’applique à : ✔️ SDK .NET Core 2.1 et versions ultérieures
Le script PerfCollect
est utile pour collecter des traces de performances et c’est l’outil recommandé pour collecter les traces antérieures à .NET Core 3.0. Si vous utilisez PerfCollect
dans un conteneur, gardez à l’esprit les exigences suivantes :
PerfCollect
nécessite des capacités supplémentaires pour exécuter l’outilperf
. L’ensemble minimal de capacités nécessaire estPERFMON
etSYS_PTRACE
. Certains environnements nécessitentSYS_ADMIN
. Veillez à démarrer le conteneur avec les capacités nécessaires. Si l’ensemble minimal ne fonctionne pas, essayez avec l’ensemble complet.PerfCollect
nécessite que certaines variables d’environnement soient définies avant le démarrage de l’application dont elle effectue le profilage. Celles-ci peuvent être définies dans un fichier Dockerfile ou lors du démarrage du conteneur. Étant donné que ces variables ne doivent pas être définies dans des environnements de production normaux, il est courant de les ajouter lors du démarrage d’un conteneur qui sera profilé. Les deux variables requises par PerfCollect sont :DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Notes
Lors de l’exécution de l’application avec .NET 7, vous devez également définir DOTNET_EnableWriteXorExecute=0
en plus des variables d’environnement précédentes.
Notes
.NET 6 se normalise sur le préfixe DOTNET_
au lieu de COMPlus_
pour les variables d’environnement qui configurent le comportement au moment de l’exécution de .NET. Toutefois, le préfixe COMPlus_
continuera à fonctionner. Si vous utilisez une version précédente du runtime .NET, vous devez tout de même utiliser le préfixe COMPlus_
.
Utilisation de PerfCollect
dans un conteneur side-car
Si vous souhaitez exécuter PerfCollect
dans un conteneur pour profiler un processus .NET Core dans un autre conteneur, l’expérience est presque la même, sauf pour les différences suivantes :
- Les variables d’environnement mentionnées précédemment (
DOTNET_PerfMapEnabled
etDOTNET_EnableEventLog
) doivent être définies pour le conteneur cible (et non celui qui exécutePerfCollect
). - Le conteneur en cours d’exécution
PerfCollect
doit avoir la capacitéSYS_ADMIN
(et non le conteneur cible). - Les deux conteneurs doivent partager un espace de noms de processus.