Sammeln von Diagnosen in Containern

Die gleichen Diagnosetools, die für die Diagnose von .NET Core-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 CLI-Diagnosetools von .NET Core (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor und dotnet-trace) sind für die Arbeit 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 Core-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 Core in einem Sidecarcontainer

Wenn Sie die globalen CLI-Diagnosetools von .NET Core zur Diagnose von Prozessen in einem anderen Container verwenden möchten, müssen Sie die folgenden zusätzlichen Anforderungen beachten:

  1. Die Container müssen einen Prozessnamespace freigeben (damit Tools im Sidecarcontainer auf Prozesse im Zielcontainer zugreifen können).
  2. Die globalen CLI-Diagnosetools von .NET Core benötigen Zugriff auf Dateien, die von der .NET Core-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 des perf-Tools. Der minimale Satz der erforderlichen Funktionen ist PERFMON und SYS_PTRACE. Einige Umgebungen erfordern SYS_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 Core-Prozess in einem anderen Container zu erstellen, ist die Vorgehensweise mit folgenden Ausnahmen nahezu identisch:

  • Die zuvor erwähnten Umgebungsvariablen (DOTNET_PerfMapEnabled und DOTNET_EnableEventLog) müssen für den Zielcontainer gesetzt werden (nicht für den, auf dem PerfCollect läuft).
  • Der Container, in dem PerfCollect ausgeführt wird, muss über die SYS_ADMIN-Funktion verfügen (nicht der Zielcontainer).
  • Die beiden Container müssen einen Prozessnamespace gemeinsam verwenden.