2016-05-03 7 views
6

Ich versuche meine Anwendung hauptsächlich zu optimieren, um die "Verbreitung" der Antwortzeiten zu reduzieren. Der Durchschnitt ist in Ordnung, aber die Bandbreite ist zu groß.Tuning JVM für hohe Zuteilungsrate

Dynatrace zeigte, dass die höheren Reaktionszeiten mit einer längeren Zeit in Suspension verbunden sind. Dies deutet auf GC hin.

Ich habe versucht, einige JVM GC-Werte basierend auf dem Lesen online, zu wenig Erfolg zu ändern.

Basierend auf GC-Logs habe ich die Zuteilungsrate auf etwa 324 MB/s und die Promotion-Rate auf nur 0,85 MB/s. Für mich scheint dies eine sehr hohe Zuteilungsrate zu sein, also habe ich versucht, die Größe der Jungen Generation zu erhöhen.

Der erste Screenshot ist mit den Standardeinstellungen von Java 8, 1024MB XMX.

Der zweite Screenshot setzt NewRatio = 1.

Alle Vorschläge, was als nächstes zu versuchen wäre sehr geschätzt.

Dinge, die ich habe schon versucht: zu G1GC ändern, Einstellung NewRatio = 1, NewRatio = 1 und die Erhöhung Xmx auf 2048 einstellen, Einstellung NewSize = 1600m und Xmx = 2048, MetaspaceSize = 100

Einstellung bearbeiten: Hinzufügen von GC-Protokolle: http://pastebin.com/VhJwSuxv

Hinweis: Diese Protokolle sind von dem 10min-Test mit der Änderung: NewRatio = 1

enter image description here enter image description here

+1

* "Basierend auf GC Logs" *, posten sie? – the8472

+0

Link zu Pastebin mit GC-Protokollen hinzugefügt. Beachten Sie, dass diese mit der Änderung sind: NewRatio = 1 – Bobby

+0

Die jungen Kollektionen liefern eine ziemlich konsistente 70-80ms Pause. Alte Sammlungen dauern länger, aber sie sind selten und sollten erwartet werden, wenn Sie den Durchsatzkollektor verwenden. Daher sollten Sie wahrscheinlich mehr über die Reaktionsfähigkeitsmassnahmen herausfinden, um zu verifizieren, dass sie tatsächlich GC-bezogen sind. – the8472

Antwort

3

Bevor Sie den GC optimieren, sollten Sie zuerst einen Speicherprofiler verwenden, um die Zuweisungsrate zu reduzieren.

Sie können versuchen, die junge Generation weiter zu erhöhen, z. Sie können -Xmn2g -Xmx3g einstellen und das NewRatio nicht einstellen.

Ich habe die Zuweisungsrate rechnete etwa 324 MB/s,

Dies ist moderat für eine Web-Anwendung zu sein. Es könnte niedriger sein, aber ich würde keine wesentlichen Probleme auf diesem Niveau erwarten.

Ich würde mit einem viel größeren Heap je nachdem, wie der Speicher Ihrer Maschine z. -Xmn24g -Xmx32g und schauen Sie sich die Pause an. Reduzieren Sie dann die Größe des Heapspeichers, bis es die GC-Zeiten zu beeinflussen scheint (sie könnten sogar kürzer werden).

Eine andere Betrachtungsweise; Es kann sein, dass es akzeptabel ist, alle 2 bis 10 Sekunden einen kleinen GC zu haben. Dies bedeutet, dass Sie einen Eden-Speicherplatz von 650 MB bis 3,2 GB haben möchten.

+0

Danke für die Antwort. Können Sie mir ein Beispiel für einen von Ihnen vorgeschlagenen "Memory Profiler" geben? Ich habe VisualVM verwendet. Ich konnte jstatd nicht auf einem Remote-Server arbeiten lassen. Ich werde versuchen mit viel größeren Xmx und Xmn, wie Sie vorschlagen. Ich habe versucht mit NewSize = 1600/Xmx = 2048 und dies reduziert die kleine GC-Frequenz von 1s auf 4s, aber die Dauer dieser GCs dauerte etwa 3x so lang, was insgesamt negativen Einfluss auf Perf. – Bobby

+0

@Bobby Ich würde FlightRecorder versuchen. Dies kann über die Befehlszeile ausgelöst werden und gibt viel mehr Details darüber, was Sie gerade tun. –

+1

OK Ich habe Ihren Vorschlag mit viel größerem Heap und verschiedenen neuen Größen ausprobiert und kam zu einem Ergebnis, das zu mehr Leistung und verbesserter Konsistenz führt. Als nächstes wird FlightRecorder sein. Danke nochmal für die Antworten! – Bobby