Sammeln von Diagnosen in Containern
Die gleichen Diagnosetools, die für die Diagnose von .NET-Problemen in anderen Szenarien nützlich sind, funktionieren auch in Docker-Containern. Für einige Tools sind jedoch spezielle Schritte erforderlich, damit sie in einem Container funktionieren. In diesem Artikel wird beschrieben, wie Tools zum Sammeln von Leistungsüberwachungsdaten und Speicherabbildern in Docker-Containern verwendet werden können.
Verwenden von .NET-CLI-Tools in einem Container
Diese Tools gelten für: ✔️ .NET Core 3.1 SDK und höhere Versionen
Die globalen .NET-CLI-Diagnosetools (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor und dotnet-trace) sind für die Verwendung in einer Vielzahl von Umgebungen konzipiert und sollten alle direkt in Docker-Containern funktionieren. Aus diesem Grund stellen diese Tools die bevorzugte Methode dar, um in .NET-Szenarien für .NET Core 3.1 oder höher Diagnoseinformationen in Containern zu sammeln.
Sie können diese Tools auch ohne das .NET SDK installieren, indem Sie die Einzeldateivarianten unter den Links im vorherigen Absatz herunterladen. Diese Installationen erfordern eine globale Installation der .NET-Runtime, Version 3.1 oder höher, die Sie mithilfe einer der vorgeschriebenen Methoden in der .NET-Installationsdokumentation oder durch Verwenden eines der offiziellen Laufzeitcontainer abrufen können.
Verwenden globaler CLI-Tools von .NET in einem Sidecarcontainer
Wenn Sie die globalen CLI-Diagnosetools von .NET zur Diagnose von Prozessen in einem anderen Container verwenden möchten, müssen Sie die folgenden zusätzlichen Anforderungen beachten:
- Die Container müssen einen Prozessnamespace freigeben (damit Tools im Sidecarcontainer auf Prozesse im Zielcontainer zugreifen können).
- Die globalen CLI-Diagnosetools von .NET benötigen Zugriff auf Dateien, die von der .NET-Runtime in das Verzeichnis „/tmp“ geschrieben werden. Daher muss das Verzeichnis „/tmp“ über eine Volumebereitstellung von Ziel- und Sidecarcontainer gemeinsam genutzt werden. Dies lässt sich beispielsweise umsetzen, indem die Container ein Volume oder ein Kubernetes-emptyDir-Volume gemeinsam verwenden. Wenn Sie versuchen, die Diagnosetools von einem Sidecarcontainer aus zu verwenden, ohne das Verzeichnis „/tmp“ freizugeben, erhalten Sie eine Fehlermeldung, dass der Prozess „keine kompatible .NET-Runtime ausführt“.
Verwenden von PerfCollect
in einem Container
Dieses Tool gilt für: ✔️ .NET Core 2.1 und neuere Versionen
Das PerfCollect
-Skript ist für die Sammlung von Leistungsüberwachungsdaten nützlich und wird für die Erfassung von Überwachungsdaten vor .NET Core 3.0 empfohlen. Wenn Sie PerfCollect
in einem Container verwenden, beachten Sie die folgenden Anforderungen:
PerfCollect
erfordert zusätzliche Funktionen zum Ausführen desperf
-Tools. Der minimale Satz der erforderlichen Funktionen istPERFMON
undSYS_PTRACE
. Einige Umgebungen erfordernSYS_ADMIN
. Achten Sie darauf, den Container mit den erforderlichen Funktionen zu starten. Wenn der minimale Satz nicht funktioniert, versuchen Sie es mit dem vollständigen Satz.Für
PerfCollect
müssen einige Umgebungsvariablen vor dem Start der App festgelegt werden, für die ein Profil erstellt werden soll. Diese können entweder in einem Dockerfile oder beim Starten des Containers festgelegt werden. Da diese Variablen in normalen Produktionsumgebungen nicht festgelegt werden sollten, ist es üblich, sie beim Starten eines Containers für die Profilerstellung hinzuzufügen. Die folgenden zwei Variablen sind für PerfCollect erforderlich:DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Hinweis
Beim Ausführen der App mit .NET 7 müssen Sie zusätzlich zu den vorherigen Umgebungsvariablen auch DOTNET_EnableWriteXorExecute=0
festlegen.
Hinweis
In .NET 6 ist das Präfix DOTNET_
statt COMPlus_
Standard für Umgebungsvariablen, die das .NET-Runtimeverhalten konfigurieren. Das Präfix COMPlus_
funktioniert jedoch weiterhin. Wenn Sie eine frühere Version der .NET-Runtime verwenden, sollten Sie weiterhin das Präfix COMPlus_
für Umgebungsvariablen verwenden.
Verwenden von PerfCollect
in einem Sidecarcontainer
Wenn Sie PerfCollect
in einem Container ausführen möchten, um ein Profil für einen .NET-Prozess in einem anderen Container zu erstellen, ist die Erfahrung nahezu identisch. Folgende Unterschiede bestehen:
- Die zuvor erwähnten Umgebungsvariablen (
DOTNET_PerfMapEnabled
undDOTNET_EnableEventLog
) müssen für den Zielcontainer gesetzt werden (nicht für den, auf demPerfCollect
läuft). - Der Container, in dem
PerfCollect
ausgeführt wird, muss über dieSYS_ADMIN
-Funktion verfügen (nicht der Zielcontainer). - Die beiden Container müssen einen Prozessnamespace gemeinsam verwenden.