Thread-Sicherheitskopien aus einer JVM erstellen

Ein Thread-Dump ist eine Liste aller Java-Threads, die derzeit in einer Java Virtual Machine (JVM) aktiv sind. In diesem Artikel werden die verschiedenen Möglichkeiten zum Abrufen von Thread-Sicherheitskopien von einer JVM in Adobe Experience Manager erläutert.

Beschreibung description

Umgebung

Adobe Experience Manager

Problem/Symptome

Wie erhalte ich Thread-Sicherheitskopien von einer JVM unter Linux, UNIX oder Windows?

Ein Thread-Dump ist eine Liste aller Java-Threads, die derzeit in einer Java Virtual Machine (JVM) aktiv sind.

Es gibt mehrere Möglichkeiten, Thread-Sicherheitskopien von einer JVM zu erstellen. Es wird dringend empfohlen, mehr als 1 Thread-Dump zu nehmen. Es empfiehlt sich, 10 Thread-Sicherheitskopien in einem regelmäßigen Intervall zu erstellen (z. B. eine Thread-Sicherheitskopie alle zehn Sekunden).

Auflösung resolution

Schritt 1: PID Ihres Java-Prozesses abrufen

Die erste Information, die Sie benötigen, um einen Thread-Dump zu erhalten, ist die PID Ihres Java-Prozesses.

Das Java-JDK enthält den Befehl jps , der alle Java-Prozess-IDs auflistet. Sie können diesen Befehl wie folgt ausführen:

jps -l 70660 sun.tools.jps.Jps 70305

Hinweis: Unter Linux und UNIX müssen Sie diesen Befehl möglicherweise als sudo -u user jps -l ausführen, wobei "user"der Benutzername des Benutzers ist, unter dem der Java-Prozess ausgeführt wird.

Wenn dies nicht funktioniert oder Sie Ihren Java-Prozess immer noch nicht finden können (Pfad nicht festgelegt, JDK nicht installiert oder ältere Java-Version), verwenden Sie

  • UNIX, Linux und Mac OS X: ps -el | grep java
  • Windows: Drücken Sie Strg+Umschalt+Esc, um den Task Manager zu öffnen und die PID des Java-Prozesses zu finden

Schritt 2: Anfordern einer Thread-Sicherheitskopie von JVM

jstack

Wenn es installiert/verfügbar ist, empfehlen wir die Verwendung des Tools jstack . Es werden Thread-Sicherheitskopien an die Befehlszeilenkonsole gedruckt.

Führen Sie den folgenden Befehl aus, um mithilfe von jstack eine Thread-Sicherheitskopie zu erhalten:
jstack -l <pid>

Sie können aufeinander folgende Thread-Sicherheitskopien in einer Datei ausgeben, indem Sie die Umleitungs-/Anlagenrichtlinie für die Konsolenausgabe verwenden:
jstack -l <pid> >> threaddumps.log

Hinweise:

  • Das jstack-Tool ist seit JDK 1.5 verfügbar (für JVM unter Windows ist es nur in einigen Versionen von JDK 1.5 und JDK 1.6 verfügbar).

  • jstack funktioniert auch dann, wenn der Parameter -Xrs jvm aktiviert ist

  • Es ist nicht möglich, das jstack-Tool von JDK 1.6 zu verwenden, um Thread-Dumps aus einem Prozess zu nehmen, der auf JDK 1.5 ausgeführt wird.

  • Unter Linux und UNIX müssen Sie den Befehl als Benutzer ausführen, der Eigentümer des Java-Prozesses ist:
    sudo -u java-user jstack -l <pid>

    (< java-user> sollte durch die ID des Benutzers ersetzt werden, unter dem der Java-Prozess ausgeführt wird.)

  • Wenn Sie in Windows jstack ausführen und die Fehlermeldung "Für die Verarbeitung dieses Befehls ist nicht genügend Speicher verfügbar"erhalten, müssen Sie jstack als Windows SYSTEM-Benutzer oder den Benutzer ausführen, der Eigentümer des Java-Prozesses ist. Sie können dies mit psexec tun, das Sie hier herunterladen können. Um jstack als SYSTEM-Benutzer auszuführen, verwenden Sie einen Befehl wie den folgenden:

    psexec -s jstack <pid>   >> threaddumps.log

    Wenn Sie psexec nicht auf dem Server installieren können, können Sie eine .bat-Datei mit dem Befehl erstellen und diese mit unter Verwendung der Windows Task Scheduler (als anderer Benutzer) ausführen.

  • Wenn der Java-Prozess nicht reagiert, kann es manchmal hilfreich sein, die Option -J-d64 (auf 64-Bit-Systemen) zu verwenden, z. B.:
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • Wenn der jstack-Befehl (jstack -l <pid> >> threaddumps.log) den unten stehenden Fehler [ 1] ausgibt, führen Sie den Befehl als Benutzer aus, dem der Java-Prozess gehört. Beispiel:
    sudo -u sling jstack -l <pid> >> threaddumps.log

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

JSTACK-SKRIPT

Hier ist ein Skript (angepasst von dem auf eclipse.org), das eine Reihe von Thread-Sicherheitskopien mithilfe von jstack benötigt. Es nimmt auch die CPU-Nutzung auf Thread-Ebene mithilfe des obersten Befehls ein.

Führen Sie es einfach wie folgt aus:

sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>

Beispiel: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 ist die ID des Java-Prozesses
  • cq5serveruser ist der Linux- oder UNIX-Benutzer, der als Java-Prozess ausgeführt wird
  • 10 gibt an, wie viele Thread-Sicherheitskopien benötigt werden
  • 3 ist die Verzögerung zwischen den einzelnen Dump

Hinweis: Die oberste Ausgabe hat die native Thread-ID im Dezimalformat, während die Jstack-Ausgabe die NID im Hexadezimalformat hat. Sie können den hohen CPU-Thread von der oberen Ausgabe zur jstack-Ausgabe abgleichen, indem Sie die Thread-ID in hexadezimal konvertieren.

Zusätzlich zum obigen Skript haben wir auch ein ähnliches Windows Powershell-Skript und ein Adobe AEM-spezifisches Skript auf github.

Alternative Möglichkeiten zum Abrufen eines Thread-Dump

Wenn das Tool jstack nicht verfügbar ist, können Sie Thread-Sicherheitskopien wie folgt durchführen:

Hinweis: Einige Tools können keine Thread-Sicherheitskopien von der JVM verwenden, wenn der Befehlszeilenparameter -Xrs aktiviert ist. Wenn Sie Probleme beim Erstellen von Thread-Sicherheitskopien haben, überprüfen Sie, ob diese Option aktiviert ist.

UNIX, Mac OS X und Linux (JDK 1.4 oder weniger)

Unter UNIX, Mac OS X und Linux können Sie ein QUIT-Signal an den Java-Prozess senden, um ihn anzuweisen, einen Thread-Dump an die Standardausgabe auszugeben.

  1. Führen Sie dazu diesen Befehl aus:
    kill -QUIT <pid>

    Möglicherweise müssen Sie diesen Befehl als sudo -u user kill -QUIT <pid> ausführen, wobei "user"der Benutzer ist, als der der Java-Prozess ausgeführt wird.

  2. Wenn Sie CQSE mit dem crx-quickstart/server/start-Skript starten, werden Ihre Thread-Sicherheitskopien an crx-quickstart/server/logs/startup.log ausgegeben. Wenn Sie einen Drittanbieter-Anwendungsserver wie JBoss, WebSphere, Tomcat oder andere verwenden, finden Sie in der Serverdokumentation Informationen dazu, an welche Datei die Standardausgabe geleitet wird.

Windows:

JDK 1.X

  1. Laden Sie javadump.exe herunter (angehängt unten).
  2. Starten Sie die JVM mit diesen drei Argumenten (sie müssen in der richtigen Reihenfolge sein):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Drücken Sie Strg+Umschalt+Esc , um den Task Manager zu öffnen.
  4. Suchen Sie die PID des Java-Prozesses.
  5. Führen Sie in der Befehlszeile javadump.exe   <pid> aus.
  6. Die Thread-Sicherheitskopie wird in der in Schritt 2 erwähnten Datei jvmoutput.log angezeigt.

JDK 1.6

Rufen Sie eine Thread-Sicherheitskopie vom Tool jconsole ab, indem Sie ein Plug-in verwenden: [ 0]

So können Sie eine Thread-Sicherheitskopie anfordern:

  1. Fügen Sie dem JVM, das Communique ausführt, den folgenden Parameter hinzu:
    Dcom.sun.management.jmxremote
  2. Laden Sie JDK 1.6 herunter und installieren Sie es (falls noch nicht geschehen).
  3. Laden Sie das Thread Dump Analyzer-Dienstprogramm herunter und extrahieren Sie es. [ 1]
  4. Führen Sie jconsole.exe von JDK 1.6 aus:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Klicken Sie auf die Registerkarte Thread Dumps .
  6. Klicken Sie auf den Link Thread-Dump anfordern .

Hinweis: Wenn Sie AEM 6.x ausführen und die laufenden Threads beobachten möchten, können Sie http://<host>:<port>/system/console/status-Threads anfordern, eine Thread-Liste abzurufen. Beachten Sie jedoch, dass diese Thread-Dumps nicht mit Thread-Dump-Analyse-Tools wie Samurai oder tda funktionieren.

Gilt für:

Alle Adobe-Produkte, die in einer JVM ausgeführt werden

Analyse-Tools für Thread-Sicherheitskopien

[ 0] PsExec v2.42 in der Microsoft-Dokumentation zu den Signalen.

[ 1] TDA - Thread Dump Analyzer auf Irockel/tda auf Github.com.

[ 2] Java Thread Dump Analyzer auf FastThread.

[ 3] IBM Thread and Monitor Dump Analyzer for Java on IBM Support Assistant Documentation

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f