Wie teuer ist es, jstack auf einer laufenden JVM auszuführen?

8

Ich überlege, ein Skript nach

zu peitschen
  1. Lauf einmal pro Minute (oder alle fünf Minuten)
  2. Führen Sie Jstack gegen eine laufende JVM in der Produktion aus
  3. parse die Jstack-Ausgabe und sortiere Dinge, an denen ich interessiert bin
  4. exportiert die Ergebnisse für die grafische Darstellung 24/365 durch eine zentrale Cacti-Installation auf einem anderen Server

Aber ich habe keine Ahnung, wie teuer oder invasiv jstack auf einer laufenden JVM ist. Wie teuer ist es, jstack auf einer laufenden JVM auszuführen? Richte ich mich für eine Welt der Verletzung aus?

    
Stu Thompson 09.09.2010, 14:32
quelle

3 Antworten

3

Messen. Eine der time Varianten (/ usr / bin / time Ich glaube) hat eine -p Option, mit der Sie die verwendeten CPU-Ressourcen sehen können:

%Vor%

Das bedeutet, dass es 0,32 Sekunden Wandzeit benötigte, wobei 0.00 Sekunden CPU-Zeit im Benutzerbereich und 0.00 Sekunden im Kernel-Bereich verwendet wurden.

Erstellen Sie ein Testszenario, in dem Sie ein Programm ausführen, aber nichts tun, und versuchen Sie, mit der Verwendung WITH und OHNE einen Jstack zu vergleichen, der z. jede Sekunde. Dann haben Sie harte Zahlen und können experimentieren, um zu sehen, was einen angemessenen Overhead ergeben würde.

Mein Vorgefühl wäre, dass alle fünf Minuten vernachlässigbar sind.

    
quelle
3

Ich weiß, dass diese Antwort für die Party zu spät ist, aber der teure Teil von jstack kommt von der Anfügung an die Debugger-Schnittstelle, die Stack-Traces generell nicht mit einer wichtigen Ausnahme erzeugt (und die Heap-Größe spielt keine Rolle):

Beliebige Stack-Traces können nur an einem sicheren Punkt oder während der Thread wartet (d. h. außerhalb des Java-Bereichs) generiert werden. Wenn der Thread auf / außerhalb des Java-Bereichs wartet, wird der stapelanfordernde Thread die Aufgabe übernehmen, indem er selbst den Stack-Walk ausführt. Allerdings möchten Sie möglicherweise einen Thread nicht "unterbrechen", um seinen eigenen Stack zu durchlaufen, insbesondere wenn er eine Sperre hält (oder etwas beschäftigt ist). Da es keine Möglichkeit gibt, die sicheren Punkte zu kontrollieren, muss ein Risiko in Betracht gezogen werden.

Eine weitere Option im Vergleich zu jstack, die das Anhängen an die Debugging-Schnittstelle vermeidet: Thread.getAllStackTraces () oder ThreadMXBean verwenden, dabei ausführen, in einer Datei speichern und ein externes Tool verwenden, um diese Datei abzufragen.

Letzte Anmerkung: Ich liebe jstack, es ist immens auf Produktionssystem.

    
bestsss 11.06.2012 20:36
quelle
0

Abhängig von der Anzahl der Threads und der Größe Ihres Heaps kann jstack möglicherweise ziemlich teuer sein. JStack ist für die Fehlersuche gedacht und wurde nicht für das Sammeln von Statistiken entwickelt. Es könnte besser sein, ein Formular für die Instrumentierung zu verwenden oder eine JMX-Schnittstelle verfügbar zu machen, um die gewünschten Informationen direkt zu erhalten, anstatt Stack-Traces analysieren zu müssen.

    
dogbane 09.09.2010 18:08
quelle

Tags und Links