Wie kann ich den JVM-Speicher ordnungsgemäß überwachen?

9

Ich denke darüber nach, wie wir den JVM-Speichermonitor in Produktionsumgebungen auch unter Stoßzeiten mit geringem Overhead ausführen.

Angenommen, ich habe zwei Tomcat-App-Server in der Produktion, hinter denen ein Lastausgleich eingerichtet ist. Wenn ich die JVM-Speicherstatistik sehen kann, kann ich dem Lastausgleich mitteilen, dass die Anforderung nicht mehr an den Server gesendet werden soll, bei dem ein OOM-Problem auftritt. Ist das sinnvoll? Jconsole oder VisualVM verbrauchen mehr Leistungsressourcen, ist nicht meine Wahl.

Vance
quelle
Das Java Simon-Framework könnte einen Blick wert sein.
Khmarbaise

Antworten:

1

Andere haben Vorschläge zur Überwachung der Speichernutzung gemacht ...

Angenommen, ich habe zwei Tomcat-App-Server in der Produktion, hinter denen ein Lastausgleich eingerichtet ist. Wenn ich die JVM-Speicherstatistik sehen kann, kann ich dem Lastausgleich mitteilen, dass die Anforderung nicht mehr an den Server gesendet werden soll, bei dem ein OOM-Problem auftritt. Ist das sinnvoll?

Art von. Aber es ist nicht unbedingt der beste Weg, um Ihr Problem zu lösen.

Gehen wir zurück zur Wurzel des Problems ... den OOMEs. Im Zusammenhang mit Tomcat werden OOMEs wahrscheinlich durch eine der folgenden Ursachen verursacht:

  • Speicherlecks in Ihrer Anwendung (oder möglicherweise in Tomcat selbst),
  • Versuch, auf jedem Tomcat zu viele Anfragen parallel zu verarbeiten, oder
  • Einzelanfragen, die während der Verarbeitung zu viel Speicher benötigen.

Um Ihr Problem zu lösen, müssen Sie zuerst herausfinden, was passiert ... da die Lösung für jedes von ihnen unterschiedlich ist.

1) Um festzustellen, ob es sich um einen Speicherverlust handelt, müssen Sie ein Speicheranalysetool verwenden, um die Langzeitspeicher-Nutzungsmuster zu untersuchen. Dies wird wahrscheinlich ein Sägezahnmuster zeigen ... was normal ist. Was Sie suchen müssen, ist die Höhe der Unterseite der "Zähne", die im Laufe der Zeit nach oben tendiert. Das zeigt an, dass etwas Müll erzeugt, der nicht gesammelt werden kann. dh ein Speicherverlust.

Wenn Sie einen Speicherverlust haben, besteht die beste Lösung darin, herauszufinden, welcher Teil Ihres Codes dafür verantwortlich ist, und ihn zu beheben. Alles andere ... einschließlich des Lastausgleichs ... ist eine bandaide Lösung und könnte später zu schlimmeren Problemen führen.

2) Nachdem Sie Speicherlecks beseitigt haben, müssen Sie herausfinden, ob das Problem darin besteht, dass Sie zu viele Anforderungen gleichzeitig verarbeiten. Ich bin mir nicht sicher, wie ich das am besten machen kann, aber wenn dies das Problem ist (oder Sie vermuten, dass es das ist), gibt es einige mögliche Lösungen:

  • Passen Sie die Tomcat-Serverkonfiguration an, um die Anzahl der Arbeitsthreads zu verringern.

  • Wenn Ihre Anforderungen an E / A gebunden sind, können Sie sich auch die Unterstützung für die asynchrone Anforderungsbearbeitung ansehen, die in neueren Versionen der Servlet-Spezifikation verfügbar ist - siehe http://docs.oracle.com/javaee/7/tutorial/doc/. servlets012.htm . Aber das wird mehr Arbeit sein.

3) Wenn sich herausstellt, dass bestimmte Anforderungen zu viel Speicher belegen, müssen Sie vorher herausfinden, wie Sie diese Anforderungen erkennen und "bearbeiten" können. Das Erkennen und Behandeln dieser Anfragen kann schwierig sein ... und es ist schwierig, ohne Details Ihrer Bewerbung zu beraten. Einige pragmatische Lösungen sind jedoch:

  • Leiten Sie die anomalen Anforderungen an einen anderen Server mit einem großen Haufen weiter ... wo die OOMEs "normale" Anforderungen nicht stören.

  • Erhöhen Sie die Heap-Größe. Wenn Sie über genügend physischen Speicher verfügen, kann die Ausführung mit einem größeren Heap Ihre Tomcat-Server effizienter machen und OOMEs vermeiden.


Zusammenfassend möchte ich versuchen, den Lastausgleich zu versuchen , um OOMEs zu vermeiden, herauszufinden, warum Sie OOMEs erhalten ... und versuchen, die Ursache der OOMEs direkt zu beheben.

Stephen C.
quelle
0

Vielleicht ist jvmtop einen Blick wert für Sie.

Es zeigt Ihnen auf "top-like" Weise pro JVM-Basis die Überwachung von Metriken wie Speicherverbrauch, CPU-Auslastung, Thread-Anzahl usw.

MRalwasser
quelle