Warum ist die 64-Bit-JVM schneller als die 32-Bit-Version?

14

Vor kurzem habe ich ein Benchmarking der Schreibleistung des Datenbankprodukts meines Unternehmens durchgeführt, und ich habe festgestellt, dass der einfache Wechsel zu einer 64-Bit-JVM zu einer konstanten Leistungssteigerung von 20-30% führt.

Ich darf nicht sehr detailliert auf unser Produkt eingehen, aber im Grunde ist es eine spaltenorientierte Datenbank, die für die Speicherung von Protokollen optimiert ist. Der Benchmark besteht darin, ein paar Gigabyte rohe Logs einzuspeisen und zu bestimmen, wie lange es dauert, sie zu analysieren und als strukturierte Daten in der Datenbank zu speichern. Die Verarbeitung ist sowohl für die CPU als auch für die E / A sehr schwer, obwohl es in diesem Verhältnis schwer zu sagen ist.

Einige Anmerkungen zum Setup:

%Vor%

Konstanten für beide JVMs:

  • Gleiches Betriebssystem (64bit RHEL)
  • Gleiche Hardware (64bit CPU)
  • Die maximale Heap-Größe wurde auf 512 MB festgelegt (daher ist die Geschwindigkeitszunahme nicht auf die 64-Bit-JVM zurückzuführen, die einen größeren Heap verwendet)

Der Einfachheit halber habe ich alle Multithreading-Optionen in unserem Produkt deaktiviert, so dass die gesamte Verarbeitung in einem einzigen Thread erfolgt. (Als ich Multi-Threading eingeschaltet habe, wurde das System natürlich schneller, aber das Verhältnis zwischen 32-Bit- und 64-Bit-Leistung blieb ungefähr gleich.)

Also, meine Frage ist ... Warum sollte ich eine 20-30% ige Geschwindigkeitsverbesserung sehen wenn ich eine 64bit JVM benutze? Hat jemand vorher ähnliche Ergebnisse gesehen?

Meine Intuition war bisher wie folgt:

  • 64-Bit-Zeiger sind größer, so dass die L1- und L2-Caches leichter überlaufen, weshalb die Leistung auf der 64-Bit-JVM schlechter ist.

  • Die JVM verwendet einige raffinierte Pointer-Komprimierungstricks, um das oben genannte Problem so gut wie möglich zu beheben. Details auf der Sun-Site hier .

  • Die JVM darf im 64bit-Modus mehr Register verwenden, was die Geschwindigkeit etwas erhöht.

In Anbetracht der obigen drei Punkte würde ich erwarten, dass die 64-Bit-Leistung etwas langsamer ist oder in etwa der 32-Bit-JVM entspricht.

Irgendwelche Ideen? Vielen Dank im Voraus.

Bearbeiten: Einige Punkte zur Benchmark-Umgebung wurden erläutert.

    
Chris B 08.02.2011, 09:19
quelle

5 Antworten

8

Ohne Ihre Hardware zu kennen, nehme ich nur ein paar wilde Stiche

  • Ihre spezielle CPU verwendet möglicherweise einen Mikrocode, um einige x86-Befehle zu emulieren - vor allem die x87-ISA
  • x64 verwendet she math anstelle von x87 math, ich habe in diesem Fall eine% 10- 20 Beschleunigung einiger mathematiklastiger C ++ - Anwendungen bemerkt. Mathematische Unterschiede könnten der wahre Mörder sein, wenn Sie strictfp verwenden.
  • Speicher. 64 Bit geben Ihnen viel mehr Adressraum. Vielleicht ist der GC im 64-Bit-Modus etwas weniger aggressiv, weil Sie extra RAM haben.
  • Ist Ihr Betriebssystem im 64b-Modus und läuft ein 32b jvm über ein Wrapper-Dienstprogramm?
KitsuneYMG 08.02.2011, 09:57
quelle
10

Von: Ссылка

"Im Allgemeinen kommt es bei 64-Bit-VMs im Vergleich zu der Ausführung derselben Anwendung auf einer 32-Bit-VM mit den Vorteilen einer größeren Speicherkapazität zu einem geringen Leistungsverlust. Dies liegt an der Tatsache, dass jeder native Zeiger vorhanden ist im System nimmt 8 statt 4 Byte auf. Das Laden dieser zusätzlichen Daten hat Auswirkungen auf die Speichernutzung, was zu einer etwas langsameren Ausführung führt, abhängig davon, wie viele Zeiger während der Ausführung Ihres Java-Programms geladen werden Da AMD64- und EM64T-Plattformen im 64-Bit-Modus ausgeführt werden, erhält die Java-VM einige zusätzliche Register, mit denen sie effizientere native Befehlssequenzen generieren kann.Diese zusätzlichen Register erhöhen die Leistung bis zu dem Punkt, an dem beim Vergleich von 32 oft überhaupt kein Leistungsverlust auftritt zu 64-Bit-Ausführungsgeschwindigkeit.
Der Leistungsunterschied beim Vergleich einer Anwendung, die auf einer 64-Bit-Plattform ausgeführt wird, mit einer 32-Bit-Plattform auf SPARC liegt in der Größenordnung von 10-20%, wenn Sie zu einer 64-Bit-VM wechseln. Auf AMD64- und EM64T-Plattformen liegt dieser Unterschied zwischen 0 und 15%, abhängig von der Anzahl der Zeiger, die auf Ihre Anwendung zugreifen. "

    
Lucas Zamboulis 08.02.2011 09:55
quelle
2

Der 64-Bit-Befehlssatz hat 8 weitere Register, dies sollte den Code insgesamt schneller machen.

Aber da die Prozessoren heutzutage meistens auf Speicher oder Platte warten, nehme ich an, dass entweder das Speichersubsystem oder der Platten-I / O im 64-Bit-Modus effizienter ist.

    
mfx 08.02.2011 09:39
quelle
2

Meine beste Vermutung, basierend auf einem schnellen google für 32- vs 64-Bit-Leistungsdiagramme, ist, dass 64 Bit I / O effizienter ist. Ich nehme an, Sie machen eine Menge I / O ...

Wenn memcpy beim Verschieben der Daten beteiligt ist, ist es wahrscheinlich effizienter, Longs als Ints zu kopieren.

    
KarlP 08.02.2011 09:35
quelle
1

Verwirklichen Sie, dass die 64-Bit-JVM keine magische Pixie ist, die Java-Apps macht geh schneller. Die 64-Bit-JVM ermöglicht Heaps & gt; & gt; 4 GB und macht daher nur Sinn für Anwendungen, die großen Speicher auf Systemen nutzen können, die hab es.

Generell gibt es entweder eine leichte Verbesserung (bedingt durch bestimmte Hardware) Optimierungen auf bestimmten Plattformen) oder geringfügige Verschlechterung (aufgrund von Zeigergröße). Generell werden weniger GC benötigt - aber Wenn sie auftreten, werden sie wahrscheinlich länger sein.

In Speicherdatenbanken oder Suchmaschinen, die den erhöhten Speicher verwenden können zum Caching von Objekten und damit zur Vermeidung von IPC- oder Festplattenzugriffen wird der größte zu sehen sein Verbesserungen auf Anwendungsebene. Außerdem wird eine 64-Bit-JVM auch Sie können viel mehr Threads als ein 32-Bit-Thread ausführen, weil es gibt mehr Adressraum für Dinge wie Thread-Stacks usw. Die maximale Anzahl von Threads für eine 32-Bit-JVM ist ~ 1000, aber ~ 100000 Threads mit einer 64-Bit-JVM.

Einige Nachteile:
Zusätzliche Probleme mit der 64-Bit-JVM sind der bestimmte Client orientierte Funktionen wie Java Plug-in und Java Web Start werden nicht unterstützt. Auch jeder native Code würde benötigt kompatibel sein (z. B. JNI für Dinge wie JDBC-Treiber vom Typ II). Dies ist ein Bonus für Pure-Java-Entwickler als reine Apps komme einfach aus der Box.

Mehr zu diesem Thema unter Java.net

    
JSS 08.02.2011 09:29
quelle

Tags und Links