2013-05-16 5 views
9

Ich aktualisiere Produktions-Hardware, und wir sehen viel mehr junge Generation GCing auf dem neuen Satz von Kit im Vergleich zu den alten.Erhöht die Anzahl der verfügbaren Kerne und RAM die JVM mehr GCs?

Das gleiche Programm läuft auf beiden Rechnern (identische Binaries). Ein offensichtlicher Unterschied (ich hoffe, dass dies für die JVM keinen Unterschied macht) ist, dass wir RHEL5 -> RHEL6 aufgerüstet haben.

Unsere JVM (Java 64-Bit-Hotspot 1.6, gleiche java -version auf beide) läuft mit den gleichen Befehlszeile GC Optionen:

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParallelGC -XX:+UseCompressedOops 

auch:

-Xmx1024M -Xms1024M -XX:NewSize=512M -XX:SurvivorRatio=2 

Der Unterschied zwischen der Maschinen ist, dass die neue Box hat etwa doppelt so viel RAM (32gb - obwohl die maximale Heap unverändert ist) und einige weitere Kerne (24 vs. 16).

Die Anwendung selbst verbindet sich mit mehreren externen Prozessen und führt viele Netzwerkoperationen aus - so könnte eine Regression, Fehlkonfiguration oder Inkompatibilität anzeigen (deshalb testen wir ...). Was ich gerne wissen würde ist:

Ist ein erhöhtes Niveau von Young-Gen GC wahrscheinlich eine natürliche und erwartete Folge von mehr Kernen laufen, oder sollte ich über diese Entwicklung besorgt sein?

Wir bestätigten die Anzahl der GCs in JConsole, aber das ist ungefähr das Gleiche wie zu tun:

grep "PSYoungGen" ./log | wc -l 

(beachten Sie -XX:+PrintGC -XX:+PrintGCDetails)

Voll GCs auf beiden Boxen gleich aussehen zu.

Hinweis: Dies ist die Anzahl der GCs während des gesamten Startprozesses der Anwendung - es führt also nicht "mehr Arbeit" aus. Es ist die gleiche Arbeit, mit mehr GC-Läufen.

Ich frage mich zum Beispiel, ob -XX:+UseParallelGC zu viel mehr Einträge im Protokoll führen würde, weil mehr Threads verwendet wurden (hacken die Young-Gen-Sammlungen in kleinere Stücke, bedeutet mehr, kleinere Sammlungen - nicht etwas zu beunruhigen Über).

+4

Weitere Cores -> mehr Computing pro Sekunde -> mehr GC pro Sekunde. –

+0

Gleiche JVM auf beiden Maschinen? (1.6x64) – assylias

+0

@assylias Gleiche JVM auf beiden (aktualisierte Frage). – jelford

Antwort

1

Puzzling Frage ...

Kurze Antwort

Nein, die GC-Frequenz nur eine Funktion Ihrer Schöpfung Rate ist. Sofern Ihre Anwendung diese neue Hardware nicht nutzt, sollte die GC-Frequenz identisch sein.

Lange Antwort

Ich glaube nicht an das OS-Upgrade bezieht, noch glaube ich die Erhöhung des gesamten RAM hat damit etwas zu tun.

Es kann nicht von einer Erhöhung der Zeigergröße kommen, da die maximale Heap-Größe 1 GB ist. Daher verwendet die JVM bereits 32-Bit-Zeiger, selbst wenn Sie sich auf einer 64-Bit-JVM befinden.

Verwendet Ihre Anwendung alle Kerne beim Start?

Es könnte die Erhöhung der YoungGC-Raten erklären: Wenn Ihre Anwendung 8 weitere Threads verwendet, bedeutet dies, dass sie mehr Arbeit für die gleiche Zeit ausführt. Sie sollten eine Erhöhung der Zuteilungsrate beobachten (siehe Ihre GC-Protokolle).

Sie sollten auch eine Abnahme der Young GC-Dauer bemerken, da PSScavenge mehr Threads verwendet. Ist das richtig ?

Nach this page, ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5)/8). Sie haben 13 Threads für einen YGC-Zyklus verwendet und verwenden jetzt 18.

+0

Die Anzahl der Threads wird von http://www.c0t0d0s0.org/archives/6617-About-Java,-parallel-garbage-collection-and-processor-sets.html bestätigt. Aber der komische Teil ist, dass es im Verlauf der gleichen Menge an Arbeit mehr GCs gibt (ich denke * - es könnte sein, dass irgendeine Drittanbieter-Bibliothek hinterhältig Threads erzeugt). – jelford

+0

Sie müssen wirklich Ihre Zuweisungsrate vor dem Upgrade und nach dem Upgrade vergleichen, um diese "gleiche Menge an Arbeit" zu bestätigen. Wenn Sie zuvor einen AR von 500 MB/s hatten und jetzt 750 MB/s haben, wird Ihr GC häufiger benötigt, um mit Ihren Anwendungsanforderungen Schritt zu halten. –

+0

Würde ich das messen, indem ich AR = GCs * Eden Space/#seconds mache? Wenn ja, dann muss Eden Space, da es unverändert ist, notwendigerweise mehr sein (da GC count höher ist). Oder habe ich etwas verpasst? – jelford

-3

Es hängt von Ihrer OS-Architektur (x64 oder x86) mit einem x86 der JVM geht bis zu 4 GB mit einem x64 geht es bis 2 GB (RAM ammount).

Verwandte Themen