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 den användare 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

jstack

Om det är installerat/tillgängligt rekommenderar vi att du använder verktyget jstack. 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 jvm-parametern -Xrs ä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 hämta 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 PowerEdge på servern kan du skapa en .bat-fil som innehåller kommandot och köra det med Windows Schemaläggaren (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 jstack-kommandot (jstack -l <pid> >> threaddumps.log) orsakar felet [ ] nedan kör du kommandot som den användare som äger java-processen. 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 ett skript (anpassat från det på 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 pid för Java-processen
  • cq5serveruser är den Linux- eller UNIX-användare som Java-processen körs som
  • 10 är antalet tråddumpar som ska tas bort
  • 3 är fördröjningen mellan varje dump

Obs! De översta 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å ett liknande Windows Powershell-skript och ett Adobe AEM-specifikt skript på github.

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

Om verktyget jstack inte är tillgängligt för dig, kan du hämta tråddumpar enligt följande:

Obs! Vissa verktyg kan inte hämta tråddumpar från JVM om kommandoradsparametern -Xrs är aktiverad. 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 användaren som Java-processen körs som.

  2. Om du startar CQSE med skriptet crx-quickstart/server/start kommer dina trådsdumpar att skrivas ut på 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> från kommandoraden
  6. Tråddumpen visas i filen jvmoutput.log som nämns i steg 2.

JDK 1.6

Hämta en tråddump från jconsole-verktyget genom att använda 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å fliken Tråddumpar.
  6. Klicka på länken Begär tråddump.

Obs! Om du kör AEM 6.x och vill observera de trådar som körs kan du begära att http://<host>:<port>/system/console/status-Threads hämtar 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 i Sysinternals i Microsoft-dokumentationen.

[ 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 Support Assistant Documentation.

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