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

Description

Environnement

  • Experience Manager

Problèmes/symptômes
Comment récupérer les images mémoire de threads d’une JVM sous Linux, UNIX ou Windows ?




 


Un vidage de threads est une liste de tous les threads Java actuellement principaux 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é de consommer 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

É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 sous lequel s’exécute le processus Java.

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 : Demande d’un vidage de thread à partir de la JVM

jstack

Si elle est installée/disponible, il est recommandé d’utiliser la variable jstack outil. 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 la variable -Xrs le paramètre jvm 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. here. 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. utilisation 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, puis 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 une script (adapté de celui sur eclipse.org) qui prend 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 sous lequel le processus Java s’exécute.
  • 10 représente le nombre de vidages de fil à prendre.
  • 3 est le 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.

Outre le script ci-dessus, nous avons également un Script Windows PowerShell et script spécifique à un Adobe AEM sur github.

Outil Saut de thread pour Adobe Experience Manager

Si vous utilisez le produit Adobe Experience Manager, vous pouvez installer cet outil pour disposer d’une interface utilisateur simple pour générer des images mémoire de threads.

MOYENS ALTERNATIFS D’OBTENIR UN DÉPÔT DE THREAD

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

Remarque : Certains outils ne peuvent pas récupérer les images mémoire de thread de la JVM si le paramètre de ligne de commande -Xrs est activée. 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 s’exécute le processus Java.

  2. Si vous démarrez CQSE à l’aide de la variable crx-quickstart/server/start script , vos images mémoire de threads seront alors 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. Depuis la ligne de commande, exécutez

    javadump.exe pid

  6. Le thread dump apparaît dans la jvmoutput.log fichier mentionné à l’étape 2.


JDK 1.6

Obtenir un vidage de thread à partir de jconsole en utilisant un module externe : 0

Voici comment demander un vidage de thread :

  1. Ajoutez le paramètre suivant au fichier jvm exécutant Communique : -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 le fichier Utilitaire d’analyse de vidage de threads. 1

  4. Exécuter jconsole.exe de JDK 1.6 :

    jconsole.exe -pluginpath /path/to/file/tda.jar

  5. Cliquez sur le bouton Images mémoire de threads .

  6. Cliquez sur le bouton Saut de thread de requête lien.

Remarque : Si vous exécutez AEM 6.* et que vous souhaitez observer les threads en cours d’exécution, vous pouvez demander http://host:port/system/console/status-Threads pour 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 :

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
1  https://github.com/irockel/tda
https://fastthread.io/
https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm

Sur cette page