Récupérer les thread dumps à partir d’une JVM

Un vidage de threads est une liste de tous les threads Java actuellement actifs dans une machine virtuelle Java (JVM). Cet article décrit les différentes manières d’obtenir des images mémoire de threads à partir d’une JVM dans Adobe Experience Manager.

Description description

Environnement

Adobe Experience Manager

Problème/Symptômes

Comment obtenir des images mémoire de threads à partir d’une JVM sous Linux, UNIX ou Windows ?

Un vidage de threads est une liste de tous les threads Java actuellement actifs dans une machine virtuelle Java (JVM).

Il existe plusieurs façons de récupérer les images mémoire de threads d’une JVM. Il est vivement recommandé d’utiliser plus d’un vidage de thread. Une bonne pratique consiste à effectuer 10 vidages de thread à un intervalle régulier (par exemple, un vidage de thread toutes les dix secondes).

Résolution resolution

Étape 1 : Obtention du PID de votre processus Java

Le premier élément d’information dont vous aurez besoin pour obtenir un vidage de thread est le PID de votre processus Java.

Le JDK Java est fourni avec la commande jps qui répertorie tous les identifiants de processus Java. Vous pouvez exécuter cette commande comme suit :

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

Remarque : Sous Linux et UNIX, vous devrez peut-être exécuter cette commande en tant que sudo -u user jps -l, où "user" est le nom d’utilisateur de l’utilisateur sous lequel le processus Java est exécuté.

Si cela ne fonctionne pas ou si vous ne trouvez toujours pas votre processus Java (chemin non défini, JDK non installé ou ancienne version de Java), utilisez

  • UNIX, Linux et Mac OS X : ps -el | grep java
  • Windows : appuyez sur Ctrl+Maj+Échap pour ouvrir le gestionnaire de tâches et rechercher le PID du processus Java.

Étape 2 : demander un vidage de thread à partir de la JVM

jstack

S’il est installé/disponible, nous vous recommandons d’utiliser l’outil jstack. Il imprime les images mémoire de threads dans la console de ligne de commande.

Pour obtenir un thread dump à l’aide de jstack, exécutez la commande suivante :
jstack -l <pid>

Vous pouvez générer des vidages consécutifs de threads dans un fichier à l’aide de la directive de sortie de console redirection/ajout :
jstack -l <pid> >> threaddumps.log

Remarques :

  • L’outil jstack est disponible depuis JDK 1.5 (pour JVM sous Windows, il est disponible dans certaines versions de JDK 1.5 et JDK 1.6 uniquement).

  • jstack fonctionne même si le paramètre jvm -Xrs est activé

  • Il n’est pas possible d’utiliser l’outil jstack de JDK 1.6 pour extraire les images mémoire de threads d’un processus s’exécutant sur JDK 1.5.

  • Sous Linux et UNIX, vous devez exécuter la commande en tant qu’utilisateur propriétaire du processus Java :
    sudo -u java-user jstack -l <pid>

    (< java-user> doit être remplacé par l’identifiant de l’utilisateur sous lequel le processus Java est en cours d’exécution)

  • Sous Windows, si vous exécutez jstack et obtenez l’erreur "Pas assez de stockage pour traiter cette commande", vous devez exécuter jstack en tant qu’utilisateur Windows SYSTEM ou utilisateur propriétaire du processus Java. Vous pouvez le faire en utilisant psexec que vous pouvez télécharger ici. Pour exécuter jstack en tant qu’utilisateur SYSTEM, utilisez une commande comme celle-ci :

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

    Si vous ne parvenez pas à installer psexec sur le serveur, vous pouvez créer un fichier .bat contenant la commande et l'exécuter à l'aide du planificateur de tâches Windows (en tant qu'utilisateur différent).

  • Si le processus java ne répond pas, il peut parfois aider à utiliser l’option -J-d64 (sur les systèmes 64 bits), par exemple :
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • Si la commande jstack (jstack -l <pid> >> threaddumps.log) renvoie l’erreur [ 1] ci-dessous, exécutez la commande en tant qu’utilisateur propriétaire du processus Java. Par exemple :
    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

Voici un script (adapté de celui de eclipse.org) qui prendra une série de vidages de threads à l’aide de jstack. Il utilise également l’utilisation du processeur au niveau du thread à l’aide de la commande top.

Exécutez-le comme suit :

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

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

  • 1234 est le pid du processus Java
  • cq5serveruser est l’utilisateur Linux ou UNIX que le processus Java exécute comme
  • 10 : nombre d’images mémoire de threads à utiliser
  • 3 correspond au délai entre chaque vidage

Remarque : La sortie supérieure a l’identifiant de thread natif au format décimal tandis que la sortie jstack a l’identifiant en hexadécimal. Vous pouvez faire correspondre le thread de processeur élevé de la sortie supérieure à la sortie jstack en convertissant l’identifiant de thread en hexadécimal.

En plus du script ci-dessus, nous avons également un script Windows Powershell et un script spécifique AEM Adobe sur github.

Autres méthodes d’obtention d’un saut de fil

Si l’outil jstack n’est pas disponible pour vous, vous pouvez utiliser les images mémoire de threads comme suit :

Remarque : Certains outils ne peuvent pas extraire les images mémoire de threads de la JVM si le paramètre de ligne de commande -Xrs est activé. Si vous rencontrez des problèmes lors de la prise de thread dumps, vérifiez si cette option est activée.

UNIX, Mac OS X et Linux (JDK 1.4 ou version inférieure)

Sous UNIX, Mac OS X et Linux, vous pouvez envoyer un signal QUIT au processus Java pour lui indiquer de générer un vidage de threads en sortie standard.

  1. Exécutez cette commande pour effectuer les opérations suivantes :
    kill -QUIT <pid>

    Vous devrez peut-être exécuter cette commande en tant que sudo -u user kill -QUIT <pid> où "user" est l’utilisateur sous lequel le processus Java est en cours d’exécution.

  2. Si vous démarrez CQSE à l’aide du script crx-quickstart/server/start, vos images mémoire de threads seront générées vers crx-quickstart/server/logs/startup.log. Si vous utilisez un serveur d’applications tiers tel que JBoss, WebSphere, Tomcat ou autre, consultez la documentation du serveur pour savoir à quel fichier est dirigé la sortie standard.

Windows :

JDK 1.X

  1. Téléchargez javadump.exe (joint ci-dessous).
  2. Démarrez la JVM avec ces trois arguments (ils doivent être dans le bon ordre) :
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Appuyez sur Ctrl+Maj+Échap pour ouvrir le Gestionnaire de tâches.
  4. Recherchez le PID du processus Java.
  5. Sur la ligne de commande, exécutez : javadump.exe   <pid>
  6. Le thread dump apparaît dans le fichier jvmoutput.log mentionné à l’étape 2.

JDK 1.6

Récupérez un thread dump à partir de l'outil jconsole à l'aide d'un module externe : [ 0]

Voici comment demander un vidage de thread :

  1. Ajoutez le paramètre suivant à la commande jvm en cours d’exécution :
    Dcom.sun.management.jmxremote
  2. Téléchargez et installez JDK 1.6 (si ce n’est pas encore fait).
  3. Téléchargez et extrayez l’utilitaire Thread Dump Analyzer. [ 1]
  4. Exécutez jconsole.exe de JDK 1.6 :
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Cliquez sur l’onglet Décharges de threads .
  6. Cliquez sur le lien Demander le saut de thread .

Remarque : Si vous exécutez AEM 6.x et souhaitez observer les threads en cours d’exécution, vous pouvez demander à http://<host>:<port>/system/console/status-Threads d’obtenir une liste de threads. Toutefois, notez que ces images mémoire de threads ne fonctionneront pas avec les outils d’analyse de thread dump tels que samurai ou tda.

S’applique à :

Tous les produits Adobe s’exécutant dans une JVM

Outils d’analyse de vidage de threads

[ 0] PsExec v2.42 dans la documentation Sysinternals dans Microsoft.

[ 1] TDA - Thread Dump Analyzer sur irockel/tda sur Github.com.

[ 2] Java Thread Dump Analyzer sur FastThread.

[ 3] IBM Thread and Monitor Dump Analyzer pour Java sur la documentation de l’assistant de support IBM.

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