Acquisire immagini thread da una JVM

Un’immagine thread è un elenco di tutti i thread Java attualmente attivi in una Java Virtual Machine (JVM). Questo articolo illustra diversi modi per ottenere immagini thread da una JVM in Adobe Experience Manager.

Descrizione description

Ambiente

Adobe Experience Manager

Problema/Sintomi

Come ottenere le immagini thread da una JVM su Linux, UNIX o Windows?

Un’immagine thread è un elenco di tutti i thread Java attualmente attivi in una Java Virtual Machine (JVM).

Esistono diversi modi per acquisire immagini thread da una JVM. Si consiglia vivamente di utilizzare più di 1 immagine thread. È buona norma acquisire 10 immagini thread a intervalli regolari (ad esempio, un’immagine thread ogni dieci secondi).

Risoluzione resolution

Passaggio 1: ottieni il PID del processo Java

La prima informazione necessaria per ottenere un’immagine thread è il PID del processo Java.

Java JDK viene fornito con il comando jps che elenca tutti gli ID processo Java. Puoi eseguire questo comando come segue:

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

Nota: In Linux e UNIX, potrebbe essere necessario eseguire questo comando come sudo -u user jps -l, dove "utente" è il nome utente dell'utente con cui viene eseguito il processo Java.

Se non funziona o se non riesci ancora a trovare il processo Java, (percorso non impostato, JDK non installato o versione Java precedente), utilizza

  • UNIX, Linux e Mac OS X: ps -el | grep java
  • Windows: premi Ctrl+Maiusc+Esc per aprire Gestione attività e trovare il PID del processo Java

Passaggio 2: richiedere un’immagine thread da JVM

jstack

Se installato/disponibile, è consigliabile utilizzare lo strumento jstack. Stampa le immagini thread nella console della riga di comando.

Per ottenere un’immagine thread utilizzando jstack, esegui il comando seguente:
jstack -l <pid>

Puoi inviare dump di thread consecutivi a un file utilizzando la direttiva di reindirizzamento/aggiunta output della console:
jstack -l <pid> >> threaddumps.log

Note:

  • Lo strumento jstack è disponibile a partire da JDK 1.5 (per JVM su Windows, è disponibile solo in alcune versioni di JDK 1.5 e JDK 1.6).

  • jstack funziona anche se il parametro jvm -Xrs è abilitato

  • Non è possibile utilizzare lo strumento jstack di JDK 1.6 per acquisire immagini thread da un processo in esecuzione su JDK 1.5.

  • In Linux e UNIX, è necessario eseguire il comando come utente proprietario del processo Java:
    sudo -u java-user jstack -l <pid>

    (< java-user> deve essere sostituito con l'id dell'utente con cui è in esecuzione il processo Java)

  • In Windows, se si esegue jstack e si riceve l'errore "Spazio di archiviazione insufficiente per elaborare questo comando", è necessario eseguire jstack come utente di Windows SYSTEM o come utente proprietario del processo Java. Puoi farlo utilizzando psexec, che puoi scaricare qui. Per eseguire jstack come utente SYSTEM, utilizzare un comando simile al seguente:

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

    Se non è possibile installare psexec nel server, è possibile creare un file con estensione bat contenente il comando ed eseguirlo utilizzando l'Utilità di pianificazione di Windows (come utente diverso).

  • Se il processo Java non risponde, a volte può essere utile utilizzare l'opzione -J-d64 (su sistemi a 64 bit), ad esempio:
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • Se il comando jstack (jstack -l <pid> >> threaddumps.log) genera l'errore [ 1] di seguito, eseguire il comando come utente proprietario del processo java. Ad esempio:
    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)

SCRIPT JSTACK

Ecco uno script (adattato da quello di eclipse.org) che richiederà una serie di immagini thread utilizzando jstack. Utilizza anche l’utilizzo della cpu a livello di thread utilizzando il comando top.

Esegui la procedura in questo modo:

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

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

  • 1234 è il pid del processo Java
  • cq5serveruser è l'utente Linux o UNIX che esegue il processo Java
  • 10 è il numero di immagini thread da acquisire
  • 3 è il ritardo tra ciascun dump

Nota: l'output superiore ha l'ID thread nativo in formato decimale, mentre l'output jstack ha l'ID esadecimale. Puoi far corrispondere il thread cpu alto dall’output superiore all’output jstack convertendo l’ID thread in esadecimale.

Oltre allo script precedente, è disponibile anche uno script Windows Powershell simile e uno script Adobe specifico per AEM su github.

Modalità alternative per ottenere un'immagine thread

Se lo strumento jstack non è disponibile, è possibile eseguire le immagini thread nel modo seguente:

Nota: alcuni strumenti non possono acquisire immagini thread da JVM se il parametro della riga di comando -Xrs è abilitato. In caso di problemi durante l’acquisizione delle immagini thread, verifica se questa opzione è abilitata.

UNIX, Mac OS X e Linux (JDK 1.4 o versione inferiore)

In UNIX, Mac OS X e Linux, è possibile inviare un segnale QUIT al processo Java per indicare di inviare un dump di thread all'output standard.

  1. Esegui questo comando per eseguire questa operazione:
    kill -QUIT <pid>

    Potrebbe essere necessario eseguire questo comando come sudo -u user kill -QUIT <pid>, dove "utente" è l'utente con cui viene eseguito il processo Java.

  2. Se si avvia CQSE utilizzando lo script crx-quickstart/server/start, le immagini thread verranno inviate a crx-quickstart/server/logs/startup.log. Se utilizzi un server applicazioni di terze parti, ad esempio JBoss, WebSphere, Tomcat o altro, consulta la documentazione del server per individuare il file a cui viene indirizzato l’output standard.

Windows:

JDK 1.X

  1. Scaricare javadump.exe (in allegato).
  2. Avvia JVM con i tre argomenti seguenti (devono essere nell'ordine corretto):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Premere Ctrl+Maiusc+Esc per aprire Gestione attività.
  4. Trova il PID del processo Java.
  5. Dalla riga di comando, eseguire: javadump.exe   <pid>
  6. L'immagine del thread verrà visualizzata nel file jvmoutput.log menzionato nel passaggio 2.

JDK 1.6

Ottieni un'immagine thread dallo strumento jconsole utilizzando un plug-in: [ 0]

Ecco come richiedere un’immagine thread:

  1. Aggiungi il seguente parametro a jvm che esegue Communique:
    Dcom.sun.management.jmxremote
  2. Scarica e installa JDK 1.6 (se non l’hai ancora fatto).
  3. Scaricare ed estrarre l'utilità Thread Dump Analyzer. [ 1]
  4. Esegui jconsole.exe di JDK 1.6:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Fai clic sulla scheda Immagini thread.
  6. Fare clic sul collegamento Immagine thread di richiesta.

Nota: se si esegue AEM 6.x e si desidera osservare i thread in esecuzione, è possibile richiedere a http://<host>:<port>/system/console/status-Threads di ottenere un elenco di thread. Tuttavia, tieni presente che queste immagini thread non funzioneranno con gli strumenti di analisi delle immagini thread, come samurai o tda.

Si applica a:

Tutti i prodotti Adobe in esecuzione in una JVM

Strumenti di analisi delle immagini thread

[ 0] PsExec v2.42 in Sysinternals nella documentazione di Microsoft.

[ 1] TDA - Analisi dettagli thread su irockel/tda su Github.com.

[ 2] Analisi immagine thread Java in FastThread.

[ 3] Analisi delle immagini thread e dei monitor di IBM per Java nella documentazione dell'Assistente al supporto IBM.

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