Collecter les diagnostics dans les conteneurs
Les mêmes outils de diagnostic qui sont utiles pour diagnostiquer les problèmes .NET 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.
Utiliser les outils CLI .NET dans un conteneur
Ces outils s’appliquent à : ✔️ SDK .NET Core 3.1 et versions ultérieures
Les outils de diagnostic CLI globaux .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor et dotnet-trace) sont conçus pour fonctionner dans une grande variété d'environnements et devraient tous fonctionner directement dans les conteneurs Docker. Pour cette raison, ces outils sont la méthode préférée pour collecter des informations de diagnostic pour les scénarios .NET ciblant .NET Core 3.1 ou une 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.
Utiliser les outils CLI globaux .NET dans un conteneur sidecar
Si vous souhaitez utiliser les outils de diagnostic CLI globaux .NET pour diagnostiquer des processus dans un conteneur différent, 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 ont besoin d'accéder aux fichiers que le runtime .NET écrit dans le répertoire /tmp, de sorte que le répertoire /tmp doit être partagé entre le conteneur cible et le conteneur sidecar par le biais d'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é ».
Utiliser 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 qu'il profile. Ces paramètres peuvent être définis dans un fichier Docker ou lorsque vous démarrez le 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_
.
Utiliser PerfCollect
dans un conteneur sidecar
Si vous voulez exécuter PerfCollect
dans un conteneur pour profiler un processus .NET dans un autre conteneur, l'expérience est presque la même. Les différences sont les 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.