rh2010 - stock.adobe.com

Tipps zum Java Performance Tuning, um die JVM zu optimieren

Es gibt zwei Schritte zur Java-Leistungsoptimierung. Zuerst beurteilen Sie Ihr System. Dann optimieren Sie gemeinsam genutzte Ressourcen wie CPU und Speicher.

Softwareentwicklung macht Spaß. Die Fehlersuche in laufenden Anwendungen, wenn sie funktionale Anforderungen wie Leistung, Durchsatz und Antwortzeiten nicht erfüllen, macht dagegen keinen Spaß. Deshalb sollte jedes DevOps-Team eine Strategie zur Java-Performance-Optimierung haben, um JVM-Leistungsprobleme (Java Virtual Machine) zu identifizieren und zu beheben.

Bevor Sie jedoch sagen können, dass Sie ein Java-Performance-Problem haben, müssen Sie zunächst sicherstellen, dass Sie nicht erwarten, dass Ihre Anwendung über die maximale Kapazität des Systems hinaus arbeitet. Welche Art von Leistung ist auf Ihrer aktuellen Hardware tatsächlich erzielbar? Wenn Ihr JVM-Leistungsziel die Fähigkeiten Ihrer zugrunde liegenden Server übersteigt, werden Java-Code-Optimierungen keinen Nutzen haben.

Benchmarks zur Systemkapazität

Es ist unwahrscheinlich, dass Entwickler die genauen Leistungsfähigkeiten des Servers, auf dem ihre Anwendung gehostet wird, kennen. Aber Sie können normalerweise veröffentlichte Benchmarks für ein System finden, das demjenigen ähnlich ist, welches Sie in der Produktion verwenden.

TPC.org ist eine praktische Seite, um etablierte Benchmarks für moderne Unternehmensserver zu finden, die in einer stark transaktionalen Umgebung laufen. TPC.org gibt beispielsweise an, dass ein moderner Lenovo ThinkSystem SR650 mit 56 Kernen und 112 Threads in der Lage ist, fast 7.000 Transaktionen pro Sekunde zu verarbeiten. Und ein zwölf Jahre altes IBM System x3850 mit acht Kernen und 32 Prozessoren kann lediglich 800 Transaktionen pro Sekunde verarbeiten.

Finden Sie heraus, wo in diesem Bereich Ihre eigenen Server liegen, und sehen Sie, wie nahe Ihre Produktionssysteme an einem etablierten Benchmark liegen. Wenn Ihre Anwendung unter einem etablierten Benchmark liegt, sind Java-Leistungsoptimierungen möglich. Doch nur weil es möglich ist, zu optimieren, heißt das noch lange nicht, dass Sie es auch tun sollten.

JVM-Leistungsziele

Der Grund dafür, Zeit in die Java-Performance-Optimierung zu investieren, ist nicht, ob Sie das meiste aus jedem Taktzyklus herausquetschen. Achten Sie stattdessen darauf, ob Sie in der Lage sind, die Leistungsziele zu erreichen.

DevOps-Teams sollten keine Zeit investieren, das meiste aus jedem Taktzyklus herauszuholen. Sie sollten nur dann in Java-Leistungsoptimierung investieren, wenn Ihre aktuellen Performance-Ziele nicht erreicht werden.

Abbildung 1: Die Funktionen von Java.
Abbildung 1: Die Funktionen von Java.

Jede Anwendung sollte klar definierte Benchmarks haben. Was ist die längste akzeptable Antwortzeit? Wie viele Transaktionen sollten pro Sekunde verarbeitet werden? Was ist der maximale Durchsatz, den eine Anwendung bewältigen können muss?

Gut formulierte, quantitative Ziele sollten festgelegt werden für:

Das Leistungsmanifest einer Anwendung könnte Aussagen wie die folgende enthalten:

  • Die Anwendung unterstützt 500 Transaktionen pro Sekunde.
  • Die Seitenladezeiten betragen weniger als zwei Sekunden.
  • Das Failover erfolgt in weniger als fünf Sekunden.
  • 99 Prozent der Transaktionen werden in weniger als 40 Millisekunden (ms) ausgeführt.
  • Die zustandslose Antwortzeit beträgt durchschnittlich 50 ms.
  • Die zustandsbehaftete Antwortzeiten betragen durchschnittlich 500 ms.
  • Die Java-CPU-Auslastung übersteigt nicht mehr als zwei aufeinanderfolgende Minuten lang 50 Prozent.

Wenn Ihre Anwendung unterhalb der festgelegten Benchmarks für Ihr System arbeitet, können Sie mit der Untersuchung beginnen, wie Sie die Java-Performance optimieren können.

Leitfaden zur Optimierung der Java-Leistung

Die meisten Java-Leistungsprobleme können auf eine der folgenden vier gemeinsam genutzten Ressourcen zurückgeführt werden:

  1. CPU
  2. Arbeitsspeicher
  3. I/O-Operationen
  4. Threads

Ein Java-Profiler wie Java Flight Recorder kann helfen, den Engpass in Ihrer Anwendung sofort zu identifizieren. Verwenden Sie Java Mission Control, um folgende Metriken zu untersuchen:

  • CPU-Auslastung
  • Systemkontextwechsel
  • Auslastung des physischen Speichers
  • Heap-Verbrauch
  • genutzte Netzwerkbandbreite
  • Festplatten-I/O-Latenz
  • Datenbanksperren
  • SQL-Latenzzeit
  • Garbage-Collection-Häufigkeit
  • Garbage-Collection-Pausenzeit
  • Thread-Konflikte
  • Thread-Pausen
  • Thread-Sperren

Ziele der Java-Leistungsoptimierung

Sobald Sie wissen, welche gemeinsam genutzte Ressource das JVM-Leistungsproblem verursacht, untersuchen Sie Stack Traces, um die aktiven Java-Klassen und -Methoden zu identifizieren, wenn das Leistungsproblem auftritt. In achtzig Prozent der Fälle wird eine Java-Leistungsoptimierung erreicht, wenn Sie:

  • schnellere Datenbankabfragen verwenden;
  • Speicherlecks identifizieren und beheben;
  • Garbage-Collection-Routinen optimieren;
  • Thread-Sperren und Parallelitätsprobleme beheben;
  • ineffizienten Code in der Anwendung beheben; und
  • die richtige Auflistungsklasse für die Listenverarbeitung verwenden.

Sobald Sie die Softwarekomponente identifiziert haben, die für die Leistungsverschlechterung verantwortlich ist, liegt es am Entwicklungsteam, die Aufgabe der Java-Code-Optimierung zu priorisieren.

Code-Änderungen, Bugfixes, iterative Updates und Performance-Test-Routinen werden schließlich zu einem Performance-Patch führen, der den Engpass behebt, die Anwendung optimiert und die JVM-Performance wieder in Einklang mit den erklärten Zielen Ihres Unternehmens bringt.

Die Behebung von Performance-Problemen ist nie eine angenehme Aufgabe. Aber mit einem effektiven Leitfaden zur Java-Performance-Optimierung, der darauf achtet, was möglich ist, was die Performance-Ziele sind und ein Auge darauf hat, wie man Engpässe identifiziert, wenn sie entstehen, wird die Aufgabe der Java-Performance-Optimierung viel einfacher.

Hinweis: Vieles von dem, was Sie hier über Java-Performance-Tuning und -Optimierung lernen, stammt von Kirk Pepperdine und Jack Shirazi. Viele der besprochenen Ideen lassen sich auf diese beiden Java-Performance-Experten zurückführen.

Erfahren Sie mehr über Softwareentwicklung