Skip to main content

Analyse d'un "thread dump" d'une JVM IBM sous AIX

Dans quels cas le thread dump est utile ?
Le thread dump est un instantané de l'activité des threads de la JVM. Leur analyse est intéressante dans les cas où l'activité de la JVM ne semble pas normale :
  • Activité suspendue (deadlock/interblocage) ou partiellement suspendue (starvation/famine)
  • Activité existante mais le "débit" est en deçà de ce qui est attendu (Goulot d'étranglement / Bottleneck)
  • Activité existante mais le "débit" reste nul (Boucle infinie / Infinite Loop)
Comment avoir un thread dump ?
Nous nous limitons ici à la machine virtuel IBM sous AIX. Dans ce cas là il est extrêmement simple de déclencher la création d'un thread dump : il suffit de faire un kill -3 sur le processus Java.

Un fichier dont le nom est javacore.[date].[numero_processus].[compteur].txt est produit. Sur la sortie standard du processus vous devriez voir la ligne suivante s'afficher :
JVMDUMP010I Java Dump written to .....
En général le dump est produit dans le répertoire de travail du processus Java. Sous Oracle Weblogic il s'agit du répertoire du domaine : /..../domain/javacore...ou sous Tomcat il s'agit du répertoire bin
Attention : la production d'un tread dump est une opération couteuse qui fige l'activité de la machine virtuelle pendant un certain temps. Elle ralentie donc l'activité de cette dernière.

Comment lire le thread dump ?
Un thread dump est un fichier texte, vous pouvez l'ouvrir avec n'importe quel éditeur de texte. Mais à la longue, si vous devez en analyser plusieurs et que vous travaillez sur un serveur d'application qui fait tourner plusieurs centaines de threads en parallèle cela devient vite fastidieux.
Heureusement un monsieur chez IBM, Jinwoo Hwang, a réalisé un excellent logiciel pour l'analyse des thread dumps : IBM Thread and Monitor Dump Analyzer for Java. Cerise sur le gâteau on peut le télécharger librement sur le site d'IBM (à condition de s'inscrire) : http://www.alphaworks.ibm.com/tech/jca/download

Exemple sur un "Bottleneck"
Le code suivant va simuler un traitement long avec verrou d'un moniteur afin de simuler un goulot d'étranglement :

@WebServlet("/wait")
public class WaitServlet extends HttpServlet {
    private static Object lock = new Object();
    protected void doGet(
            HttpServletRequest request,
            HttpServletResponse response
    ) throws ServletException, IOException {
        response.getWriter().println("We need the lock");
        synchronized (lock) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        response.getWriter().println("OK");
    }
}

Cette servlet va être embarquée dans un Tomcat 7 et nous allons utiliser une JVM IBM 1.6.0 SR9FP1
N.B. Sur les versions antérieur à la SR9 un blocage de la JVM peut se produire lors de la demande du thread dump. On se retrouve alors avec un thread dump incomplet et une JVM complètement bloquée. Plus de détail sur http://www-01.ibm.com/support/docview.wss?uid=swg1IZ84925

Analyse du thread dump de l'exemple
Une  fois l'utilitaire démarré charger le thread dump :
  1. File ->  Open Thread Dumps : sélectionner le fichier qui commence par javacore.
  2. Cliquez sur le thread dump qui apparait alors dans la liste
  3. Analysis -> Monitor Detail
Une vue semblable à celle ci-dessous s'affiche : 
Exemple d'analyse d'analyse des moniteurs d'un thread dump IBM
J'ai démarré 10 clients en simultané avec JMeter.
Ce thread dump montre qu'un thread (celui qui s'appelle "http-bio-8080"-exec-7) possède le verrou sur notre objet partagé décrit dans la section Monitor : Owns Monitor Lock on java/lang/Object@0xB0A65A60
On peut aussi voir précisément qu'elle partie du code possède le verrou, pas de surprise ici il s'agit bien de la méthode doGet de la servlet.
A gauche, sous le thread qui possède le verrou, on peut voir la liste des 9 autres threads (et donc client HTTP) en attente. Si vous cliquez sur l'un de ces threads vous verrez où ces derniers sont en attentes et sur quel objet :
Détail d'un thread en attente

En vous souhaitant une bonne analyse de vos threads sous IBM AIX.

Comments

Popular posts from this blog

Orientée colonnes ?

Les bases NoSQL sont arrivées avec leur cortège de nouveautés et pour certaines d'entre elles une notion héritée de BigTable : celle de base de donnée orientée colonne. Cependant faire le lien entre l'article de Wikipedia et comprendre ce que permet réellement un base de donnée comme HBase n'est pas une chose évidente. En effet le simple fait de définir cette notion ne suffit pas toujours a bien comprendre quels sont les principes de conception du monde SQL qui peuvent être oubliés et ceux qui doivent être appris. Colonne or not colonne ? Prenons un modèle très simple de donnée et essayons de le transposer dans un modèle "orienté colonne": Comme on peut le voir on est passé d'un modèle à 2 dimensions (ligne x colonne) vers un modèle où une valeur est accédée au travers de 2  coordonnées qui sont ici (ligne, colonne) Cette notion de coordonnées est  importante  (c'est pour ça que je la met en gras 2 fois de suite) si l'on veut c

Row Count : HBase Aggregation example

With the coprocessors HBase 0.92 introduces a new way to process data directly on a region server. As a user this is definitively a very exciting feature : now you can easily define your own distributed data services. This post is not intended to help you how to define them (i highly recommend you to watch this presentation if you want to do so) but to quickly presents the new aggregation service shipped with HBase 0.92 that is built upon the endpoint coprocessor framework. 1. Enable AggregationClient coprocessor You have two choices : You can enable aggregation coprocessor on all your tables by adding the following lines to hbase-site.xml : <property> <name>hbase.coprocessor.user.region.classes</name> <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value> </property> or ...you can enable coprocessor only on a table throught the HBase shell : 1. disable the table hbase> disable ' mytable ' 2.

HBase + Subversion + Eclipse + Windows

HBase + Subversion + Eclipse + Windows (it should be easy to adapt for Linux) Update : please note that since HBase-4336 / HBase 0.96 the source tree is split in more than one Maven module this post is no more relevant, i have created a new post on this subject : http://michaelmorello.blogspot.fr/2012/06/hbase-096-eclipse-maven.html This is a simple setup in order to play with the source code of HBase under Microsoft Windows. Since HBase use some Unix specific commands like chmod the only requirements here are  Cygwin and a working Maven 3 environment. (It is obvious that you need Java and Eclipse , but you DON'T need anything else like the Eclipse Maven plugin or any SSH configuration) 1. Checkout the source code The first step is to check out the source code from the Subversion repository. I did it under my cygwin home repository. In this example i want to play with the 0.90 branch : svn co http://svn.apache.org/repos/asf/hbase/branches/0.90/ hbase-0.90