Ziel

Analysieren Sie AEM-Java-Thread-Sicherungskopien mithilfe des IBM Thread Analyzer-Tools.

Schritte

  1. Laden Sie IBM Thread Analyzer herunter und installieren Sie ihn (wird hier als IBM TDA abgekürzt).
  2. Erfassen Sie Thread-Sicherungskopien über eine AEM-Instanz, auf der Leistungsprobleme auftreten.
  3. Öffnen Sie die Thread-Sicherungskopien in IBM TDA.
  4. Wählen Sie zum Anzeigen der Details einer Thread-Sicherungskopie die Datei in der Auflistung und klicken Sie auf die Schaltfläche* für die Thread-Details.
tda-threaddetail
  1. Nehmen Sie die Sortierung nach Stack-Tiefe vor, wobei sich die längsten Stacks oben befinden sollten.
tda-image1
  1. Überprüfen Sie die Threads mit einer Stack-Tiefe von mindestens 10 Zeilen.  Hierbei handelt es sich für gewöhnlich um die interessantesten Threads.  Machen Sie sich Notizen zu den interessanten Threads.
  2. Sortieren Sie nach Thread-Status.
  3. Blättern Sie nach unten zu den ausführbaren Threads. Bei ausführbaren Threads handelt es sich um jene, die die CPU-Zeit aktiv in Anspruch nahmen, als die Thread-Sicherungskopie erstellt wurde.

Hinweis: Beim Überprüfen der ausführbaren Threads können Sie die im Abschnitt Ignorierbare Threads aufgeführten Threads unten auf dieser Seite ignorieren.

  1. Suchen Sie nach ausführbaren Threads, die Teil der Anwendung sind, beispielsweise Hintergrundauftrags-Threads oder Anfrage-Threads (Anfrage-Threads weisen Namen wie diesen auf 127.0.0.1 [1347028187737] GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1). Klicken Sie, nachdem Sie sie gefunden haben, nach und nach auf sie.
  2. Für jeden Anfrage-Thread können Sie herausfinden, wann der Browser des Benutzers die Anfrage an den Server gesendet hat, indem Sie im Thread-Namen den Zeitstempel prüfen.  Beispielsweise lautet der Zeitstempel im obigen Thread-Namen 1347028187737 (im Unixzeit-Format in Millisekunden).  Diese Unixzeit-Zahl kann mit www.epochconverter.com in ein Datum bzw. eine Uhrzeit umgewandelt werden.  Jede Thread-Sicherungskopie zeigt das Datum und die Uhrzeit ihrer Erstellung an.  Sie können den Unterschied zwischen der Anfragezeit und der Thread-Sicherungskopiezeit verwenden, um nachzuvollziehen, wie lange eine Anfrage aktiv war.
  3. Blättern Sie nach dem Überprüfen der Anfrage-Threads durch die anderen ausführbaren Threads.  Sobald Sie einen interessanten ausführbaren Thread gefunden haben, sollten Sie den mittleren Bereich „Waiting Threads“ ansehen.  Die hier aufgeführten Threads warten, bis der ausgewählte Thread einen Monitor freigibt. Wenn keine wartenden Threads angezeigt werden, könnte Ihr ausgewählter Thread weiterhin der Lock-Inhaber sein (Details finden Sie im Thema über das „Implementieren von Klassen von Lock“). Beispielsweise können Sie anhand von ReentrantReadWriteLock nicht bestimmen, welcher Thread der Lock-Inhaber ist, da Locks mehrere Monitore intern implementieren.  Auf diese Weise müssen Sie möglicherweise den Quellcode ansehen, um ihn mit dem Thread zu vergleichen, bei dem es sich um den Lock-Inhaber handeln könnte.
  4. Wenn der Thread über einen Lock oder Monitor verfügt, auf den viele andere Threads warten, sollten Sie die restlichen Thread-Sicherungskopien durchlaufen, um zu sehen, ob Sie andere Threads finden können, die das gleiche Problem aufweisen.  Überprüfen Sie, ob derselbe Thread weiterhin in anderen Sicherungskopien (in IBM TDA können Sie mehrere Thread-Sicherungskopien auswählen und auf die Schaltfläche* zum Vergleichen von Threads klicken) vorhanden ist, um den Status eines Threads über mehrere Thread-Sicherungskopien anzuzeigen.
tda-comparethreads
  1. Im folgenden Screenshot sehen Sie „Collector Service“:
tda-Image2
  1. In dieser Ansicht können Sie den Thread über mehrere Thread-Sicherungskopien hinweg anzeigen, um zu überprüfen, ob es sich um einen Thread handelt, dessen Ausführung lange dauert.  Im Grunde handelt es sich um einen Thread, dessen Ausführung lange dauert, wenn der Thread über mehrere Sicherungskopien hinweg den ausführbaren Status aufweist und einen langen Stack besitzt.
  2. Wenn Sie bei der Anzeige der ausführbaren Threads nicht viel finden, sollten Sie zurück zur Thread-Auflistung navigieren, eine Thread-Sicherungskopie auswählen und im oberen Bereich auf die Schaltfläche* „Monitor Detail“ klicken. IBM TDA öffnet ein Fenster, das eine Strukturansicht des Monitors anzeigt, dem die Threads und deren wartende Threads gehören. Hinweis: Es werden möglicherweise einige Thread-Pool-Threads angezeigt, beispielsweise der Servlet-Engine-Thread-Pool-Monitor. Im Leerlauf befindliche Threads können ignoriert werden.  Sie können für gewöhnlich bestimmen, ob es sich bei einem Thread um einen Thread-Pool-Thread im Leerlauf handelt, da sie meistens nicht mehr als 10 Stack-Zeilen aufweisen.
tda-monitordetail
  1. Klicken Sie im oberen Bereich auf die Schaltfläche „Find long-running threads“ (diese Schaltfläche weist ein Fernglassymbol auf).
  2. Unten links sollte nun ein neues Symbol hinter den Thread-Sicherungskopien angezeigt werden. Wenn Sie darauf klicken, werden alle Threads angezeigt, deren Ausführung lange dauert.
  3. Nehmen Sie erneut eine Sortierung nach Status im rechten Bereich vor.
  4. Blättern Sie nach unten zu den ausführbaren Threads, um Threads zu finden, die in den gesamten Sicherungskopien einen ausführbaren Status aufweisen.
CPU-Auslastung auf Thread-Ebene (nur Linux-Plattform):
  1. Wenn Sie zusätzlich zu den Thread-Sicherungskopien die Ausgabe „top -H -b -n1 -p <javapid>“ erfasst haben, können Sie einen Querverweis der CPU-Auslastung auf Thread-Ebene vornehmen.  Öffnen Sie die Top-Ausgabe und rufen Sie die Prozess-ID der Threads ab, die die CPU nutzen.  Konvertieren Sie die Prozess-ID in einen hexadezimalen Wert und suchen Sie dann nach diesem hexadezimalen Wert in der entsprechenden Thread-Sicherungskopiedatei.  Die ID sollte mit der „nid“ von einem der Threads übereinstimmen.
  2. Wenn der die meiste CPU in Anspruch nehmende Thread „VM Thread“ oder „GC“-Threads entspricht, liegt möglicherweise ein Arbeitsspeicherproblem vor.  Wiederholen Sie dieselbe Übung für weitere Thread-Sicherungskopien und die Top-Ausgabe. Liegt ein Muster dieser die CPU-Zeit beanspruchenden Threads vor, haben Sie ein Arbeitsspeicherproblem.
  3. Wenn Sie das Arbeitsspeicherproblem bestätigt haben, sollten Sie beim nächsten Auftreten des Problems eine Heap-Sicherungskopie erfassen.  Weitere Details zum Erfassen und Analysieren von Heap-Sicherungskopien finden Sie in diesem Artikel.

Ignorierbare Threads:

  • VM Thread: Dies ist ein VM-System-Thread.
  • Threads, die mit „GC task thread“ beginnen: Hierbei handelt es sich um Garbage-Collection-Threads.
  • Threads mit Namen wie [1347028691218] im Code unter „java.net.PlainSocketImpl.socketAccept“(native Methode): Hierbei handelt es sich um Threads auf dem Thread-Pool der Servlet-Engine, die auf neue Verbindungen warten.

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie