12 Stimmen

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

Ich überlege, ein Skript zu erstellen, um

  1. einmal pro Minute (oder alle fünf Minuten) ausgeführt werden
  2. gegen eine laufende JVM in Produktion jstack ausführen
  3. die jstack-Ausgabe parsen und Dinge, die mich interessieren, zusammenzählen
  4. die Ergebnisse für die grafische Darstellung 24/365 von einer zentralisierten Cacti-Installation auf einem anderen Server exportieren

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? Stelle ich mich damit auf eine Welt voller Probleme ein?

0 Stimmen

Hast du darüber nachgedacht zu messen?

0 Stimmen

Statt jstack als separaten Prozess auszuführen, was halten Sie davon, einen einfachen Profiler innerhalb der Anwendung laufen zu lassen? Das wäre effizienter, da kein Netzwerkoverhead erforderlich ist. Ich habe ein solches Tool geschrieben: code.google.com/p/h2database/source/browse/trunk/h2/src/main‌​/… - Sie können es bei Bedarf auch in eine .jsp-Datei konvertieren.

0 Stimmen

@Thorbjørn Ravn Andersen : Verzeihung?

5voto

bestsss Punkte 11264

Ich weiß, dass diese Antwort spät kommt, aber der teure Teil von jstack kommt vom Anschließen an die Debugger-Schnittstelle und nicht vom allgemeinen Generieren der Stack-Traces mit einer wichtigen Ausnahme (und die Heap-Größe spielt überhaupt keine Rolle):

Beliebige Stack-Traces können nur an einem sicheren Punkt generiert werden oder während der Thread auf eine Ressource wartet (außerhalb des Java-Bereichs). Wenn der Thread außerhalb des Java-Bereichs wartet, trägt der Thread, der die Stack-Abfrage durchführt, die Aufgabe aus, indem er den Stack selbst durchläuft. Sie möchten jedoch möglicherweise nicht einen Thread "unterbrechen", um seinen eigenen Stack zu durchlaufen, insbesondere wenn er ein Sperre hält (oder ein Busy-Wait durchführt). Da es keine Möglichkeit gibt, die sicheren Punkte zu steuern - das ist ein Risiko, das berücksichtigt werden muss.

Eine andere Option im Vergleich zu jstack, um das Anschließen an die Debug-Schnittstelle zu vermeiden: Thread.getAllStackTraces() oder die Verwendung des ThreadMXBean, führen Sie es im Prozess aus, speichern Sie es in einer Datei und verwenden Sie ein externes Tool, um diese Datei abzufragen.

Letzte Anmerkung: Ich liebe jstack, es ist großartig auf Produktionssystemen.

0 Stimmen

@StuThompson, Ich bin geneigt, das auch zu beantworten: stackoverflow.com/questions/3651737/… die Kurzantwort ist, dass nicht direkt adressierbare Puffer für echte Eingabe/Ausgabe schlecht sind, wenn Sie weitere ausführliche Informationen benötigen, kann ich es versuchen... Ich poste nicht viel und neige dazu, Profile von Personen zu überprüfen, deren Beiträge mich interessiert haben. Diese Frage hatte keine ausgewählte Antwort, also hoffte ich, dass ich sie erhellen könnte.

0 Stimmen

Um, ich habe nach etwas mehr als "Non-Direct-Buffer-Saugvermögen" gesucht... das habe ich selbst sehr gut dokumentiert mit Benchmarks ;) Ich bin wirklich neugierig auf die Unterschiede an der Klippe dort.

3voto

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

ravn:~ ravn$ /usr/bin/time -p echo Hallo Welt
Hallo Welt
real         0.32
user         0.00
sys          0.00
ravn:~ ravn$ 

Dies bedeutet, dass es 0,32 Sekunden Wandzeit dauerte, wobei 0,00 Sekunden CPU-Zeit im Benutzerbereich und 0,00 Sekunden im Kernelbereich verwendet wurden.

Erstellen Sie ein Test-Szenario, in dem ein Programm läuft, aber nichts tut, und vergleichen Sie den Verbrauch MIT und OHNE Anbringen eines jstacks, z.B. jede Sekunde. Dann haben Sie harte Zahlen und können experimentieren, um zu sehen, was einen vernünftigen Overhead verursachen würde.

Meine Vermutung wäre, dass einmal alle fünf Minuten vernachlässigbar ist.

0 Stimmen

OK: real 0.54, user 0.51, sys 0.07 auf einem leicht belasteten System. Werde es später heute versuchen. Abgesehen davon, wie lange es dauert, welchen Einfluss hat jstack auf die JVM? Ein kompletter Stopp?

0 Stimmen

Bitte denken Sie daran, Ihre Anwendung zu messen, nicht den jstack-Aufruf.

0 Stimmen

Es ist eine Webanwendung, die in Tomcat läuft. Hmmm...vielleicht sollte ich jstack in einer Schleife ausführen und die Anzahl der Aufrufe pro Minute mit der CPU-Auslastung des Java Tomcat-Prozesses vergleichen. Vielen Dank für den Vorschlag und die Unterstützung beim Nachdenken darüber.

0voto

dogbane Punkte 253146

Je nach Anzahl der Threads und der Größe Ihres Heap könnte jstack möglicherweise ziemlich teuer sein. JStack ist für die Fehlerbehebung gedacht und wurde nicht für die Statistikerfassung entwickelt. Es könnte besser sein, eine Art Instrumentierung zu verwenden oder eine JMX-Schnittstelle freizugeben, um die gewünschten Informationen direkt zu erhalten, anstatt Stack-Traces analysieren zu müssen.

0 Stimmen

1000 Threads, <1GB Heap. Ich erwäge jstack, weil ich es kenne und schnell umsetzen kann. JMX wird wohl funktionieren, erfordert aber etwas Einarbeitung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X