Ta tråddumpar från en JVM

En tråddump är en lista över alla Java-trådar som är aktiva i en Java Virtual Machine (JVM). I den här artikeln beskrivs flera sätt att hämta tråddumpar från en JVM i Adobe Experience Manager.

Beskrivning description

Miljö

Adobe Experience Manager

Problem/symtom

Hur skaffar man tråddumpar från en JVM i Linux, UNIX eller Windows?

En tråddump är en lista över alla Java-trådar som är aktiva i en Java Virtual Machine (JVM).

Det finns flera sätt att ta tråddumpar från en JVM. Vi rekommenderar att du tar mer än en tråddump. Ett bra tillvägagångssätt är att ta 10 tråddumpar med regelbundna intervall (till exempel en tråddump var tionde sekund).

Upplösning resolution

Steg 1: Hämta PID för Java-processen

Den första informationen du behöver för att kunna få en tråddump är Java-processens PID.

Java JDK levereras med kommandot jps som visar alla Java-process-ID:n. Du kan köra det här kommandot så här:

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

Obs! I Linux och UNIX kan du behöva köra det här kommandot som sudo -u user jps -l, där "user" är användarnamnet för användaren som Java-processen körs som.

Om detta inte fungerar eller om du fortfarande inte kan hitta din Java-process (sökväg inte inställd, JDK inte installerad eller äldre Java-version), använd

  • UNIX, Linux och Mac OS X: ps -el | grep java
  • Windows: Tryck på Ctrl+Skift+Esc för att öppna uppgiftshanteraren och hitta PID:t för Java-processen

Steg 2: Begär en tråddump från JVM

jack

Om det är installerat/tillgängligt rekommenderar vi att du använder jack verktyg. Det skriver ut tråddumpar till kommandoradskonsolen.

Kör följande kommando för att få en tråddump med jstack:
jstack -l <pid>

Du kan skriva ut tråd som kommer efter varandra till en fil med hjälp av direktivet redirect/append för konsolutdata:
jstack -l <pid> >> threaddumps.log

Anteckningar:

  • Verktyget jstack är tillgängligt sedan JDK 1.5 (för JVM i Windows är det endast tillgängligt i vissa versioner av JDK 1.5 och JDK 1.6).

  • jstack fungerar även om -Xrs jvm-parametern är aktiverad

  • Det går inte att använda stackverktyget från JDK 1.6 för att hämta tråddumpar från en process som körs i JDK 1.5.

  • I Linux och UNIX måste du köra kommandot som den användare som äger java-processen:
    sudo -u java-user jstack -l <pid>

    (< java-user> ska ersättas med ID:t för användaren som Java-processen körs som)

  • Om du kör jstack i Windows och får felmeddelandet "Det finns inte tillräckligt med lagringsutrymme för att bearbeta det här kommandot" måste du köra jstack som Windows SYSTEM-användare eller som äger java-processen. Du kan göra detta genom att använda psexec som du kan ladda ned här. Om du vill köra jstack som SYSTEM-användare använder du ett kommando som det här:

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

    Om du inte kan installera programmet på servern kan du skapa en .bat-fil som innehåller kommandot och köra den med uppgiftsschemaläggaren i Windows (som en annan användare).

  • Om java-processen inte svarar kan det ibland hjälpa att använda alternativet -J-d64 (på 64-bitarssystem), till exempel:
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • Om kommandot jstack (jstack -l <pid> >> threaddumps.log) genererar felet [ 1] kör sedan kommandot som den användare som äger java-processen. Till exempel:
    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

Här är en script (anpassat från den eclipse.org) som tar en serie tråddumpar med hjälp av jstack. Det tar även tråd-nivåens CPU-användning med det övre kommandot.

Gör så här:

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

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

  • 1234 är en del av Java-processen
  • cq5serveruser är den Linux- eller UNIX-användare som Java-processen körs som
  • 10 är hur många tråddumpar som ska tas
  • 3 är fördröjningen mellan varje dump

Obs! Det övre utdata har det inbyggda tråd-ID:t i decimalformat medan jstack-utdata har noden i hexadecimal form. Du kan matcha den höga cpu-tråden från den översta utskriften till stackutdata genom att konvertera tråd-ID:t till hexadecimalt.

Förutom skriptet ovan har vi också en liknande Windows PowerShell-skript och ett Adobe-AEM-specifikt skript på github.

Alternativa sätt att hämta en tråddump

Om jack är inte tillgängligt för dig, så du kan använda tråddumpar enligt följande:

Obs! Vissa verktyg kan inte hämta tråddumpar från JVM om kommandoradsparametern -Xrs är aktiverat. Om du har problem med att ta tråddumpar bör du kontrollera om det här alternativet är aktiverat.

UNIX, Mac OS X och Linux (JDK 1.4 eller senare)

På UNIX, Mac OS X och Linux kan du skicka en QUIT-signal till Java-processen för att ange att en tråddump ska skickas till standardutdata.

  1. Kör det här kommandot för att göra detta:
    kill -QUIT <pid>

    Du kan behöva köra det här kommandot som sudo -u user kill -QUIT <pid> där "användare" är den användare som Java-processen körs som.

  2. Om du startar CQSE med crx-quickstart/server/start skript kommer trådsdumpar att skrivas ut till crx-quickstart/server/logs/startup.log. Om du använder en programserver från en annan tillverkare, t.ex. JBoss, WebSphere, Tomcat eller någon annan, kan du läsa serverns dokumentation för att ta reda på vilken fil standardutdata är avsett för.

Windows:

JDK 1.X

  1. Hämta javadump.exe (bifogas nedan).
  2. Starta JVM med följande tre argument (de måste vara i rätt ordning):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Tryck på Ctrl+Skift+Esc för att öppna Aktivitetshanteraren.
  4. Hitta PID för Java-processen.
  5. Kör: javadump.exe   <pid>
  6. Tråddumpen visas i jvmoutput.log som nämns i steg 2.

JDK 1.6

Hämta en tråddump från jconsole med ett plugin-program: [ 0]

Så här kan du begära en tråddump:

  1. Lägg till följande parameter i den jvm som kör Communique:
    Dcom.sun.management.jmxremote
  2. Hämta och installera JDK 1.6 (om det inte är klart än).
  3. Hämta och extrahera Verktyget Tråddumpsanalys. [ 1]
  4. Kör jconsole.exe av JDK 1.6:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Klicka på Tråddumpar -fliken.
  6. Klicka på Begär tråddump länk.

Obs! Om du kör AEM 6.x och vill observera de trådar som körs kan du begära http://<host>:<port>/system/console/status-Threads för att få en trådlista. Observera dock att dessa tråddumpar inte fungerar med verktyg för tråddumpsanalys som samurai eller tda.

Gäller för:

Alla Adobe-produkter som körs i en JVM

Verktyg för tråddumpanalys

[ 0] PsExec v2.42 in Sysinternals in Microsoft documentation.

[ 1] TDA - Tråddumpsanalys på irockel/tda på Github.com.

[ 2] Java Thread Dump Analyzer på FastThread.

[ 3] IBM Thread and Monitor Dump Analyzer för Java på IBM supportassistentdokumentation.

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