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 acquisire immagini thread da una JVM.

Descrizione description

Ambiente

Experience Manager

Problema/Sintomi

Come estrarre 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 "user" è 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, si consiglia di utilizzare jstack strumento. 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 -Xrs il parametro jvm è 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 sul server, è possibile creare un file .bat contenente il comando ed eseguirlo utilizzo dell'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, esegui il comando come utente proprietario del processo java. 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 un script (adattato da quello 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 con cui viene eseguito il processo Java
  • 10 è il numero di immagini thread da acquisire
  • 3 è il ritardo tra ciascuna immagine

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

Oltre allo script qui sopra, abbiamo anche un Script di Windows Powershell e un Adobe di script specifico per AEM su github.

Modalità alternative per ottenere un'immagine thread

Se il jstack non è disponibile, è possibile acquisire le immagini thread come segue:

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 "user" è l’utente con cui il processo Java viene eseguito.

  2. Se si avvia CQSE utilizzando crx-quickstart/server/start quindi 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, esegui: javadump.exe   <pid>
  6. L’immagine thread verrà visualizzata nel jvmoutput.log file menzionato nel passaggio 2.

JDK 1,6

Ottieni un’immagine thread da jconsole mediante 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. Scarica ed estrai il file Utilità Thread Dump Analyzer. [ 1]
  4. Esegui jconsole.exe di JDK 1.6:

    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Fai clic su Thread dump scheda.
  6. Fai clic su Richiedi immagine thread collegamento.

Nota: Se lei ha un’infezione da AEM 6.* e desideri osservare i thread in esecuzione, puoi richiedere http://<host>:<port>/system/console/status-Threads per 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 - Analizzatore immagini thread su irockel/tda su Github.com.

[ 2] Java Thread Dump Analyzer su FastThread.

[ 3] Analisi delle immagini thread e monitor di IBM per Java sulla documentazione dell’Assistente al supporto IBM.

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