2011-01-14 12 views
6

Ich habe eine Java-Webanwendung auf einem Tomcat-Server (Linux) ausgeführt. In der Produktionsumgebung stehe ich vor einem Performance-Problem. In zufälligen Intervallen beginnt der jsvc-Prozess, auf dem tomcat läuft, mit einer CPU von 90-100%. Ich kann den Auslöser für dieses Ereignis nicht finden. Der Server ist ein Quad-Core-System. Der Speicherverbrauch zeigt keine Anomalien an.Tools zur Überwachung der Java-Thread-Ausführung

Wie kann ich überwachen, welcher Thread (Application Stack Trace) in der Anwendung das Problem verursacht?

Ich überprüfe mit jconsole und PSI Probe, aber beide geben keine detaillierten Informationen darüber, was Thread innerhalb der Anwendung verursacht die CPU-Anomalie.

+0

Was mit dem '[Javascript-Performance]' Tag ist? – skaffman

+0

@skaffman, Tut mir leid, Java-Performance, ich habe es korrigiert. –

+0

Wir hatten auch einige Performance-Probleme mit unseren Produktionsservern, und seit wir einen Profiler an einen Produktionsserver angeschlossen haben, ist das schwierig. Wir haben NewRelic einen Versuch gegeben. Es ist ein fantastisches Werkzeug für Ihre Leistungsuntersuchungen. – eSniff

Antwort

5

Eine relativ einfache Möglichkeit, dies zu tun (die für Ihren Fall kann oder auch nicht - hängt davon ab, wie lange das Verhalten auftritt):

Wenn Ihre App das Verhalten zeigt Sie debuggen (in diesem Fall wollen verwenden, 90-100% CPU Nutzung) jstack auf der Prozess-ID:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

zu prüfen, welche Threads ausgeführt werden und in welchem ​​Verfahren sie auftreten. Wenn Sie das ein paar Mal tun, kann es relativ einfach sein, die Täter-Aufruf-Kette zu erkennen. Sie können dann nur den Eingang zu dieser Kette debuggen.

Es ist nicht unbedingt die beste oder eleganteste Methode, aber es ist sehr einfach zu tun und es kann alles sein, was Sie brauchen. Ich würde dort anfangen. Es ähnelt der Philosophie "printf ist der beste Debugger, den ich je benutzt habe".

+3

Lassen Sie mich auch hinzufügen, dass ein Profiler wie JProfiler Ihnen wahrscheinlich mehr Metriken darüber geben wird, welche Threads was tun, aber auch dies zu verfolgen, könnte sehr zeitaufwendig sein, wenn das Problem relativ einfach ist. Daher möchte ich immer noch betonen, dass eine schnelle jstack-basierte Analyse einiger Beispiele in Ordnung ist, bevor die richtigen Profiler gestartet werden. – kvista

+0

Vista Danke für die Antwort. Ich werde Jstack versuchen. –

2

Sie können einen Stacktrace-Dump für alle Threads in einer Java-Anwendung erhalten, indem Sie ein QUIT-Signal senden.

kill -QUIT [processId] 

Dies wird im Prozess 'stdout angezeigt.

1

Nur meine 2 Cent, aber ich frage mich, wenn Sie nicht ein Speicherproblem experimentieren die CPU-Peaks könnte die GC-Aktivität sein. Während Sie also Ihren Tomcat mit jconsole überwachen, schauen Sie sich die Registerkarte "Speicher" an und prüfen Sie, ob die Heap-Auslastung nicht zu hoch ist.

4

VisualVM ist was du suchst. Es wird mit neueren JDKs geliefert und ermöglicht es Ihnen, thread usage zu überwachen.

2

Ein weiteres Werkzeug, um die Top-cpu raubend Fäden für die Ansicht ist jvmtop

Verwandte Themen