how to analyze thread dumps
src: Qu'est-ce que Thread Dump et comment les analyser? - 2020-06-29
Abstract
A thread dump contains all active thread at one time. It contains all the information on the threads and their current states, presented in stacks. Thread dumps can be used to:
- optimize JVM performance
- optimize application performance
- investigate issues, like conflicts
There are multiple ways to create a thread dump:
- using
jstack -l <pid>
- using
jvisualvm
- using
jcmd <pid> Thread.print
- using
jmc
- using
jconsole
- using
ThreadMxBean
Reviews
Nous discuterons également de la manière dont cela aide à identifier les problèmes et certains des analyseurs que vous pouvez utiliser.
What is Thread?
Un processus est un programme informatique chargé dans la mémoire de l’ordinateur et en cours d’exécution. Il peut être exécuté par un processeur ou un ensemble de processeurs. Un processus est décrit en mémoire avec des informations importantes telles que les magasins de variables, les descripteurs de fichiers, le compteur de programme, les registres et les signaux, etc.
Un processus peut être constitué de nombreux processus légers appelés discussions. Cela permet d’obtenir un parallélisme dans lequel un processus est divisé en plusieurs threads. Cela se traduit par de meilleures performances. Tous les threads d’un processus partagent le même espace mémoire et dépendent les uns des autres.
Dumps de thread
Lorsque le processus est en cours d’exécution, nous pouvons détecter l’état d’exécution actuel du threads dans le processus à l’aide de thread dumps. Un thread Dump contient un instantané de tous les threads actifs à un moment donné pendant l’exécution d’un programme. Il contient toutes les informations pertinentes sur le thread et son état actuel.
Une application moderne implique aujourd’hui plusieurs nombres de threads. Chaque thread nécessite certaines ressources, effectue certaines activités liées au processus. Cela peut améliorer les performances d’une application car les threads peuvent utiliser les cœurs de processeur disponibles.
Mais il y a des compromis, par exemple, parfois plusieurs threads peuvent ne pas bien se coordonner et une situation de blocage peut survenir. Donc, si quelque chose ne va pas, nous pouvons utiliser des vidages de threads pour inspecter l’état de nos threads.
Thread dump in Java
Un vidage de thread JVM est une liste de l’état de tous les threads qui font partie du processus à ce moment précis. Il contient des informations sur la pile du thread, présentées sous forme de trace de pile. Comme il est écrit en texte brut, le contenu peut être enregistré pour une révision ultérieure. L’analyse des thread dumps peut aider
- Optimiser les performances de la JVM
- Optimisation des performances de l’application
- Diagnostiquer des problèmes, par exemple un blocage, un conflit de threads, etc.
Generation of Thread Dumps
Il existe de nombreuses façons de générer des threads de vidage. Vous trouverez ci-dessous quelques outils basés sur JVM et peuvent être exécutés à partir de la ligne de commande / du terminal (outils CLI) ou du / bin (GUI tools) répertoire du dossier d’installation de Java.
Explorons-les.
# 1. jStackName
Le moyen le plus simple de générer un vidage de thread est d’utiliser jStack. jStack est livré avec JVM et peut être utilisé à partir de la ligne de commande. Ici, nous avons besoin du PID du processus pour lequel nous voulons générer le thread dump. Pour obtenir le PID, nous pouvons utiliser JPS comme indiqué ci-dessous.
jps -l
jps
répertorie tous les identifiants de processus Java.
Sur Windows
Sous Linux
Comme nous pouvons le voir ici, nous obtenons une liste de tous les processus java en cours d’exécution. Il contient l’ID de machine virtuelle locale pour le processus java en cours d’exécution et le nom de l’application dans les colonnes un et deux respectivement. Maintenant, pour générer le thread dump, nous utilisons le jStackName programme avec Il indicateur qui crée une sortie longue liste du vidage. Nous pouvons également diriger la sortie vers un fichier texte de notre choix.
jstack -l 26680
# 2. jvisualvm
Jvisualvm est un outil graphique qui nous aide à dépanner, surveiller et profiler les applications Java. Il est également livré avec JVM et peut être lancé à partir du / bin répertoire de notre installation java. Il est très intuitif et facile à utiliser. Entre autres options, il nous permet également de capturer le vidage de thread pour un processus particulier.
Pour afficher le thread dump pour un processus particulier, nous pouvons faire un clic droit sur le programme et sélectionner Décharge de thread dans le menu contextuel.
# 3. jcmd
JCMD est un utilitaire de ligne de commande livré avec le JDK et utilisé pour envoyer des requêtes de commande de diagnostic à la JVM.
Il ne fonctionne cependant que sur la machine locale sur laquelle l’application Java est en cours d’exécution. Il peut être utilisé pour contrôler les enregistrements de vol Java, diagnostiquer et dépanner les applications JVM et Java. Nous pouvons utiliser le Thread.print
commande de jcmd pour obtenir une liste des vidages de threads pour un processus particulier spécifié par le PID.
Voici un exemple de la façon dont nous pouvons utiliser jcmd
.
jcmd 28036 Thread.print
# 4. JMC
JMC signifie Contrôle de mission Java. Il s’agit d’un outil d’interface graphique open source fourni avec JDK et utilisé pour collecter et analyser les données d’application Java.
Il peut être lancé depuis le / bin dossier de notre installation Java. Les administrateurs et développeurs Java utilisent l’outil pour recueillir des informations détaillées de bas niveau sur les comportements de la JVM et de l’application. Il permet une analyse détaillée et efficace des données collectées par Java Enregistreur de vol.
Au lancement jmc
, nous pouvons voir la liste des processus java qui s’exécutent sur la machine locale. Une connexion à distance est également possible. Sur un processus particulier, nous pouvons faire un clic droit et choisir Démarrer l’enregistrement de vol puis vérifiez les décharges de thread dans le Threads languette.
# 5. jconsole
jconsole est un outil d’extension de gestion Java utilisé pour la gestion et la surveillance des plaintes.
Il dispose également d’un ensemble d’opérations prédéfinies sur l’agent JMX que l’utilisateur peut effectuer. Il permet à l’utilisateur de détecter et d’analyser la trace de pile d’un programme en direct. Il peut être lancé depuis le / bin dossier de notre installation Java.
En utilisant l’ jconsole Outil GUI, nous pouvons inspecter la trace de la pile de chaque thread lorsque nous le connectons à un processus Java en cours d’exécution. Ensuite, dans l’onglet Thread, nous pouvons voir le nom de tous les threads en cours d’exécution. Pour détecter une impasse, nous pouvons cliquer sur le Détecter le blocage en bas à droite de la fenêtre. Si un blocage est détecté, il apparaîtra dans un nouvel onglet sinon un Aucun blocage détecté Sera affiché.
# 6. ThreadMxBean
ThreadMXBean est l’interface de gestion du système de threads de la machine virtuelle Java appartenant au package java.lang.Management. Il est principalement utilisé pour détecter les threads qui sont entrés dans une situation de blocage et obtenir des détails à leur sujet.
Nous pouvons utiliser l’interface ThreadMxBean pour capturer par programme le vidage de thread. getThreadMXBean()
méthode de ManagementFactory
est utilisé pour obtenir une instance de ThreadMXBean
interface. Il renvoie le nombre de threads en direct démon et non démon. ManagementFactory est une classe d’usine permettant d’obtenir les beans gérés pour la plate-forme Java.
Manual Analysis of Thread Dumps
L’analyse des vidages de threads peut être très utile pour identifier les problèmes dans les processus multithreads. Les problèmes tels que les blocages, les conflits de verrouillage et l’utilisation excessive du processeur par les vidages de thread individuels peuvent être résolus en visualisant les états des vidages de thread individuels.
Le débit maximal de l’application peut être atteint en rectifiant l’état de chaque thread après avoir analysé le vidage de thread.
Par exemple, disons, un processus utilise beaucoup de CPU, nous pouvons savoir si un thread utilise le plus le CPU. S’il existe un tel thread, nous convertissons son numéro LWP en un nombre hexadécimal. Ensuite, à partir du vidage de thread, nous pouvons trouver le thread avec nid égal au nombre hexadécimal obtenu précédemment. En utilisant la trace de pile du thread, nous pouvons identifier le problème. Découvrons l’identifiant de processus du thread à l’aide de la commande ci-dessous.
ps -mo pid,lwp,stime,time,cpu -C java
Jetons un coup d’œil au morceau ci-dessous du vidage de thread. Pour obtenir un vidage de thread pour le processus 26680, utilisez jstack -l 26680
Voyons maintenant quelles sont les choses que nous pouvons explorer à l’aide de threads dumps. Si nous observons le vidage des threads, nous pouvons voir beaucoup de contenu, ce qui peut être écrasant. Cependant, si nous faisons un pas à la fois, cela peut être assez simple à comprendre. Comprenons la première ligne
2020-06-27 09:01:29
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.221-b11 mixed mode):
Ce qui précède affiche l’heure à laquelle le vidage a été généré et des informations sur la machine virtuelle Java utilisée. Ensuite, à la fin, nous pouvons voir la liste des fils, le premier d’entre eux est notre Gestionnaire de référence fil.
Analyse des threads bloqués
Si nous analysons les journaux de vidage de thread ci-dessous, nous pouvons constater qu’il a détecté des threads avec BLOQUÉ statut qui rend les performances d’une application très lentes. Donc, si nous pouvons trouver le BLOQUÉ threads, nous pouvons essayer d’extraire les threads liés aux verrous que les threads tentent d’obtenir. L’analyse de la trace de la pile du thread qui détient actuellement le verrou peut aider à résoudre le problème.
Analyse d’un thread bloqué
Une autre application très courante des thread dumps est la détection de impasses. La détection et la résolution des blocages peuvent être beaucoup plus faciles si nous analysons les décharges de threads.
Un blocage est une situation impliquant au moins deux threads où la ressource requise par un thread pour continuer l’exécution est verrouillée par un autre thread et en même temps, la ressource requise par le second thread est verrouillée par le premier thread.
Ainsi, aucun des threads ne peut continuer l’exécution, ce qui entraîne une situation de blocage et le blocage de l’application. Si des dreadlocks sont présents, la dernière section du thread dump imprimera les informations concernant le blocage comme suit.
Ici, nous pouvons voir les informations de blocage dans un format assez lisible par l’homme.
En dehors de cela, si nous résumons tous les morceaux ci-dessus de vidage de threads ensemble, il indique les informations ci-dessous.
- Gestionnaire de référence est le nom lisible par l’homme du thread.
- #2 est l’identifiant unique du thread.
- démon indique si le thread est un thread démon.
- La priorité numérique du thread est donnée par prio= 10.
- L’état actuel du thread est indiqué par attente sous condition.
- Ensuite, nous voyons la trace de la pile, qui comprend les informations de verrouillage.
Thread Dumps Analyzers
Outre l’analyse manuelle, il existe de nombreux outils disponibles pour analyser les threads, à la fois en ligne et hors ligne. Vous trouverez ci-dessous certains des outils répertoriés, que nous pouvons utiliser en fonction des besoins.
Tout d’abord, explorons les outils en ligne.
# 1. Fil rapide
Filetage rapide est DevOps l’outil d’analyse de vidage de thread préféré de l’ingénieur pour résoudre les problèmes de production complexes. Il s’agit d’un analyseur de vidage de thread Java en ligne.Nous pouvons télécharger le vidage de thread en tant que fichier ou nous pouvons directement copier et coller le vidage de thread.
En fonction de la taille, il analysera le vidage de thread et affichera les informations comme indiqué dans la capture d’écran.
En vedette
- Dépanner les plantages JVM, les ralentissements, les fuites de mémoire, les blocages, les pics de processeur
- RCA instantané (n’attendez pas les fournisseurs)
- Tableau de bord intuitif
- Prise en charge de l’API REST
- Machine Learning
# 2. Analyseur de vidage de thread Spotify
Le Analyseur de vidage de thread Spotify est sous licence sous la version 2.0 de la licence Apache. C’est un outil en ligne et accepte le thread dump sous forme de fichier ou nous pouvons directement copier et coller le thread dump. En fonction de la taille, il analysera le vidage du thread et affichera les informations comme indiqué dans la capture d’écran.
# 3. Revue de Jstack
Jstack.revue analyse les vidages de threads Java depuis le navigateur. Cette page est uniquement côté client.
# 4. Site Web 24 Ă— 7
Cette outil est une condition préalable à la détection des threads défectueux dégradant les performances de la machine virtuelle Java (JVM). Les problèmes tels que les blocages, les conflits de verrouillage et l’utilisation excessive du processeur par les vidages de thread individuels peuvent être résolus en visualisant les états des vidages de thread individuels.
Le débit maximal de l’application peut être atteint en rectifiant l’état de chaque thread fourni par l’outil.
Maintenant, explorons les outils hors ligne.
En matière de profilage, seul le meilleur outil est assez bon.
# 1. JProfilerName
JProfilerName est l’un des analyseurs de vidage de thread les plus populaires parmi Développeurs Java. L’interface utilisateur intuitive de JProfiler vous aide à résoudre les goulots d’étranglement des performances, à identifier les fuites de mémoire et à comprendre les problèmes de thread.
JProfiler prend en charge le profilage sur les plates-formes suivantes:
- Windows
- MacOS
- Linux
- FreeBSD
- Solaris
- AIX
- HP-UX
Voici quelques fonctionnalités qui font de JProfiler le premier choix pour le profilage de nos applications sur la JVM.
En vedette
- Prend en charge le profilage de base de données pour JDBC, JPA et NoSQL
- La prise en charge de l’édition d’entreprise Java est également disponible
- Présente des informations de haut niveau sur les appels RMI
- Analyse stellaire des fuites de mémoire
- Capacités d’assurance qualité étendues
- Le profileur de thread intégré est étroitement intégré aux vues de profilage du processeur.
- Prise en charge des plates-formes, des IDE et des serveurs d’applications.
# 2. IBM TMDA
IBM Thread and Monitor Dump Analyzer pour Java (TMDA) est un outil qui permet d’identifier les blocages, les blocages, les conflits de ressources et les goulots d’étranglement dans les vidages de thread Java. Il s’agit d’un produit IBM mais l’outil TMDA est fourni sans aucune garantie ni assistance; cependant, ils essaient de réparer et d’améliorer l’outil au fil du temps.
# 3. ManageEngine
ManageEngine Le gestionnaire d’applications peut aider à surveiller la mémoire JVM Heap et Non-Heap. Nous pouvons même configurer des seuils et être alerté par e-mail, SMS, etc., et nous assurer qu’une application Java est bien réglée.
# 4. VotreTrousse
VotreTrousse se compose des produits ci-dessous appelés sous forme de kit.
- Java Profiler - Profileur à faible coût complet complet pour les plates-formes Java EE et Java SE.
- YouMonitor – Surveillance des performances et profilage des Jenkins, Team City, Gradle, Maven, Ant, JUnit et TestNG.
- .NET Profiler - Profileur de performances et de mémoire facile à utiliser pour le framework .NET.
Conclusion
Vous savez maintenant à quel point les vidages de threads sont utiles pour comprendre et diagnostiquer les problèmes dans les applications multithread. Avec bon le savoir, concernant les thread dumps - leur structure, les informations qu’ils contiennent, etc. - nous pouvons les utiliser pour identifier rapidement les causes des problèmes.