Übung 2.2: Erfassen von Abbilddateien mit ProcDump unter Linux

Gilt für:   .NET Core 2.1, .NET Core 3.1, .NET 5

In diesem Artikel wird die Installation des ProcDump-Tools und das Erfassen von .NET Core-Speicherabbilddateien mit procDump unter Linux erläutert.

Voraussetzungen

Die Mindestanforderungen für die Einhaltung dieser Problembehandlungslabore sind wie folgt:

  • Eine ASP.NET Core-Anwendung, um Leistungsprobleme mit niedriger CPU- und hoher CPU-Leistung und Absturzprobleme zu veranschaulichen.
  • Der lldb-Debugger, der installiert und so konfiguriert ist, dass die SOS-Erweiterung geladen wird, wenn eine Kernabbilddatei geöffnet wird.

Wenn Sie die vorherigen Teile dieser Reihe befolgt haben, sollten Sie das folgende Setup bereit haben:

  • Nginx ist so konfiguriert, dass zwei Websites gehostet werden:
    • Der erste lauscht auf Anforderungen mithilfe des Hostheaders der myfirstwebsite ( http://myfirstwebsite ) und Routinganforderungen an die Demo ASP.NET Core Anwendung, die auf Port 5000 lauscht.
    • Der zweite lauscht auf Anforderungen mithilfe des hostsamb-Hostheaders ( http://buggyamb ) und Routinganforderungen an die zweite ASP.NET Core Beispielanwendung, die auf Port 5001 lauscht.
  • Beide ASP.NET Core Anwendungen sollten als Dienste ausgeführt werden, die automatisch neu gestartet werden, wenn der Server neu gestartet wird oder die Anwendung nicht mehr reagiert.
  • Die lokale Linux-Firewall ist aktiviert und so konfiguriert, dass SSH- und HTTP-Datenverkehr zulässig ist.

Hinweis

Wenn Ihr Setup noch nicht bereit ist, wechseln Sie zu"Teil 2 Erstellen und Ausführen ASP.NET Core Apps".

Ziel dieser Übung

In den vorherigen Laboren haben Sie gelernt, wie Sie ein Absturz- oder Leistungsproblem analysieren. Sie haben das Tool createdump zum Erfassen von Abbilddateien verwendet.

Jetzt installieren Sie ProcDump und erfassen die wichtigsten Abbilddateien mithilfe von ProcDump. Dies ist der Umfang dieser Übung, da Sie in demselben Szenario arbeiten werden, das Sie im vorherigen Teil untersucht haben.

ProcDump

Gemäß der offiziellen Seite der Linux-Version von ProcDumpist "ProcDump eine Linux-Reimagining des klassischen ProcDump-Tools aus der Sysinternals-Suite von Tools für Windows."

Die Linux-Version weist einige Einschränkungen im Vergleich mit der Windows Version auf. Es unterstützt nicht jedes Feature, das die Windows Version des Tools anbietet. Sie kann z. B. nicht so konfiguriert werden, dass kernabbilddateien erfasst werden, wenn der Prozess abstürzt oder eine Ausnahme mit der ersten Chance auslöst.

Sie ist jedoch weiterhin leistungsfähig. Die folgende Liste der Befehlszeilenoptionen ist ein langer Weg, um die Stärke des Tools nachzuweisen:

-C: Trigger core dump generation when CPU exceeds or equals specified value (0 to 100 * nCPU)
-c: Trigger core dump generation when CPU is less than specified value (0 to 100 * nCPU)
-M: Trigger core dump generation when memory commit limit exceeds or equals specified value (MB)
-m: Trigger core dump generation when memory commit limit is less than specified value (MB)
-T: Trigger core dump generation when thread count exceeds or equals specified value.
-F: Trigger core dump generation when filedescriptor count exceeds or equals specified value.

Installationsanweisungen finden Sie unter "ProcDump installieren". Denken Sie daran, dass Sie angewiesen wurden, das Microsoft-Paket-Repository hinzuzufügen, bevor Sie .NET Core installiert haben. ProcDump verwendet das gleiche Repository. Daher können Sie das Tool mithilfe des Befehls direkt sudo apt install procdump installieren.

Screenshot des Befehls "sudo apt install procdump".

Sie können ProcDump verwenden, um die CPU-, Arbeitsspeicher-, Thread- oder Dateideskriptornutzung zu überwachen.

Sie können ProcDump verwenden, um eine Speicherabbilddatei zu erfassen, wenn die CPU- oder Speicherauslastung des Zielprozesses einen bestimmten Schwellenwert erreicht oder unter einen Grenzwert fällt. Für diese Übung verwenden Sie jedoch die einfachste Methode, um das Tool aufzurufen: procdump -p <PID> . Dadurch wird manuell eine Speicherabbilddatei des Prozesses erstellt.

Erfassen Sie eine Speicherabbilddatei desselben Prozesses. Beachten Sie, dass Sie den Befehl mithilfe von ausführen sudo müssen.

Screenshot des Befehls &quot;sudo procdump&quot;.

Wo erstellt ProcDump die zentralen Abbilddateien?

Dies sind die Informationen, die Sie unbedingt kennen müssen. Sie können viel Zeit damit verbringen, zu erfahren, wo die Abbilddateien erstellt werden, wenn ProcDump zum Erfassen von Kernabbilddateien verwendet wird.

Die ProcDump-Ausgabe ist nicht klar, wo die wichtigsten Abbilddateien erstellt werden. Wie im vorherigen Screenshot gezeigt, schreibt die Ausgabe einfach den Namen der Datei, aber nicht den tatsächlichen Pfad.

Da die anderen Tools in der Regel /tmp/ oder /var/lib/systemd/coredump/ Verzeichnisse verwenden, können Sie denken, dass procDump auch eines dieser Verzeichnisse verwendet. Dies ist jedoch nicht der Fall. Stattdessen werden die von ProcDump erfassten Abbilddateien im Arbeitsverzeichnis der ASP.NET Core Anwendung erstellt.

Das Arbeitsverzeichnis für die Anwendung wird in der Dienststeuerungseinheitsdatei definiert. Wie Sie im folgenden Screenshot sehen können, lautet das Arbeitsverzeichnis der Beispielanwendung /var/BuggyAmb_v1.1. Daher wird jede Speicherabbilddatei, die ProcDump für diese Anwendung erstellt, in das Verzeichnis /var/BuggyAmb_v1.1 eingefügt.

Screenshot des Befehls &quot;Cat and ll&quot;.

Beispielszenario: Erfassen von Speicherabbilddateien basierend auf der Speicherauslastung

Stellen Sie sich folgendes Szenario vor:

  • Bei einer ASP.NET Core Anwendung, die Sie hosten, ist der Speicherverbrauch hoch.
  • Der hohe Speicherverbrauch erfolgt zufällig, und Sie wissen nicht, wie sie das Problem reproduzieren. Sie wissen nur, dass das Problem beginnt, wenn die Speicherauslastung des Commits für den Prozess, der die Anwendung hostet, 750 MB erreicht.
  • Da Sie die Speicherauslastung nicht kontinuierlich überwachen können, sollten Sie den Speicherabbildsammlungsprozess automatisieren. Ihr Ziel ist es, zwei aufeinander folgende Speicherabbilddateien desselben Prozesses zu erfassen, nachdem die Speicherauslastung den Schwellenwert von 750 MB überschritten hat.
  • Sie möchten zwei Speicherabbilddateien mit mindestens einem Intervall von fünf Sekunden zwischen der Generierung der ersten und zweiten Speicherabbilddateien erfassen.

Laut ProcDump-Hilfe müssen Sie die folgenden Optionen verwenden:

  • -M: Auslösen der Generierung von Kernabbilddateien, wenn der Speicher-Commit den angegebenen Wert (MB) überschreitet oder gleicht
  • -n: Anzahl der wichtigsten Abbilddateien, die vor dem Beenden geschrieben werden sollen (Standard ist 1)
  • -s: Fortlaufende Sekunden vor dem Schreiben der Speicherabbilddatei (Standard ist 10)
  • -d: Schreiben von Diagnoseprotokollen in Syslog
  • -p: PID des Prozesses

Führen Sie den Befehl sudo procdump -p 11724 -n 2 -s 5 -M 750 aus. Sie werden sehen, dass ProcDump wartet, bis die Kriterien, die durch die Argumente definiert werden, die an sie übergeben werden, erfüllt sind, oder bis Sie sich entschließen, die Überwachungsphase durch Drücken von STRG+C zu beenden.

Screenshot des Befehls &quot;sudo procdump p&quot;.

Während ProcDump die Speicherauslastung überwacht, reproduzieren Sie dasselbe Problem, indem Sie sechs Anforderungen an das Slow-Szenario senden, indem Sie Load Generator das Feature der Webanwendung erneut verwenden. Nachdem die Speicherauslastung den Schwellenwert erreicht hat, erstellt ProcDump Speicherabbilddateien. Der folgende Screenshot zeigt zwei erfasste Abbilddateien.

Screenshot des Befehls &quot;sudo procdump p n&quot;.

Die Speicherabbilddateien werden in das Arbeitsverzeichnis geschrieben, wie dies bei der zuvor erstellten manuellen Speicherabbilddatei der Fall war.

Screenshot des Befehls &quot;ls&quot;.

Die Dumpdateien, die mithilfe von createdump und ProcDump erstellt werden, sind hinsichtlich der darin enthaltenen Informationen identisch. Sie können wählen, welches Tool Ihrer Meinung nach besser für das Szenario geeignet ist, mit dem Sie bei der Problembehandlung konfrontiert sind.

Nächste Schritte

Übung 3: Beheben von Leistungs- und GC-Problemen mit dotnet-dump unter Linux

In Übung 3 werden weitere Optionen zum Arbeiten mit Speicherabbilddateien mithilfe dotnet-dump von und dotnet-gcdump erläutert.