2014-04-14 8 views
30

Oracle hat dies im Hinblick auf die AES-NI über Java 8 zu sagen:AES-NI-Eigen- schaften standardmäßig aktiviert?

Hardware-Spezifika Advanced Encryption Standard (AES) zu verwenden, wurden hinzugefügt. Die Flags UseAES und UseAESIntrinsics sind verfügbar, um die hardwarebasierten AES-Eigenarten für Intel-Hardware zu aktivieren. Die Hardware muss 2010 oder neuere Westmere Hardware sein. Zum Beispiel Hardware-AES zu aktivieren, verwenden Sie die folgenden Flags:

-XX:+UseAES -XX:+UseAESIntrinsics 

Um Hardware-AES verwenden, um die folgenden Flags zu deaktivieren:

-XX:-UseAES -XX:-UseAESIntrinsics 

Aber es gibt nicht an, wenn AES-Spezifika durch aktiviert sind Standard (für Prozessoren, die es unterstützen). Die Frage ist also einfach: Wenn der Prozessor AES-NI unterstützt, werden AES-Intrinsics verwendet?

Bonus Frage: Gibt es eine Möglichkeit zu testen, ob AES-NI verwendet wird? Ich denke, Sie können anhand der Leistung schätzen, aber das ist keine optimale oder sichere Art zu testen.


Für Leser, die nicht vertraut sind mit AES-NI-Spezifika sind: es Byte-Code mit vorkompilierte Maschinencode ist zu ersetzen, die AES-NI-Befehlssatz verwendet wird. Dies geschieht durch die JVM, so dass es nicht in der API der Java-Laufzeitumgebung oder des Bytecodes erscheint.

Antwort

31

Die Flagge hat einen Standardwert von wahr und es wird auf false gesetzt werden, wenn die Erkennung fehlschlägt, so können Sie einfach + PrintFlagsFinal verwenden, um zu sehen, wenn es verwendet wird:

Mein Laptop ohne AES- NI:

C:\>"C:\Program Files\Java\jdk1.7.0_51\bin\java" -XX:+PrintFlagsFinal -version | find "UseAES" 
    bool UseAES         = false   {product} 
    bool UseAESIntrinsics       = false   {product} 
java version "1.7.0_51" 
Java(TM) SE Runtime Environment (build 1.7.0_51-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode) 

Same auf dem Desktop mit AES-NI:

C:\>"C:\Program Files\Java\jdk7\bin\java" -XX:+PrintFlagsFinal -version | find "AES" 
    bool UseAES         = true   {product} 
    bool UseAESIntrinsics       = true   {product} 

java version "1.7.0_51" 
Java(TM) SE Runtime Environment (build 1.7.0_51-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode) 

C:\>"C:\Program Files (x86)\Java\jre7\bin\java" -XX:+PrintFlagsFinal -version | find "AES" 
    bool UseAES         = true   {product} 
    bool UseAESIntrinsics       = true   {product} 

java version "1.7.0_51" 
Java(TM) SE Runtime Environment (build 1.7.0_51-b13) 
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing) 

Also, es funktioniert für beide x64 und i686 (WOW64) mit den letzten Java 7. Das Feature wurde mit https://bugs.openjdk.java.net/browse/JDK-7184394 eingeführt und auf 7u40 und 7u45 rückportiert.


Wichtig: AES-NI nur auf dem Server VM verfügbar.

Dies wurde von Oracle nach a bug report was filed bestätigt. Diese wichtige Information fehlte, als sie die Featureliste von Java 8 erstellt haben, wo sie eingeführt wurde (später wurde sie auch auf 7 portiert). Die Server-VM kann explizit ausgewählt werden, indem die Option -server auf der Befehlszeile java oder javaw angegeben wird.

4

Kann nicht kommentieren (dumme SO-Regeln mehr als 50 Credits erforderlich!). This mailthread from openjdk sagt, alle AES-Eigenarten sind standardmäßig aktiviert. Obwohl ich nicht sicher bin, wie viel Oracle-Kern-VM-Code mit openjdk teilt. Wenn Sie den gesamten Thread lesen, diskutieren sie auch über Probleme auf 32-Bit-VMs, was wahrscheinlich Ihr Problem mit Ihrem zweiten Testlauf erklärt.

  • In Bezug auf Ihren Test (sorry, kann nicht sagen), glauben Sie nicht, die Unterschiede in der CPUs einen großen Unterschied machen? Core i7 sind Quadcore und haben im Allgemeinen bessere Taktraten. Hätte das nicht einen Unterschied gemacht? Ich denke, dass die Verschiebung von 21s (Kern i5, 32bitVM, AES-NI aus) zu 8s (Kern i7, 64bitVM, AES-NI aus) der Unterschied zwischen i5 und i7 ist.
  • Die Verbesserung von 8s auf 3s, obwohl nicht 7 fach, ist in der Tat ein 'Yipes' wert! :)
  • In Bezug auf den Erkennungsmechanismus - es scheint nicht ein direkter Weg zu sein. JVM gibt eine Warnung "AES intrinsics nicht verfügbar auf dieser CPU" aus, wenn Sie die Flags aktiviert haben und keine AES-Unterstützung finden können - as per this bug report.
+0

AES CBC ist streng linear, so dass mehrere Kerne keine Rolle spielen (und natürlich läuft ich mit einem Task-Scheduler oder oben aktiviert). Außerdem kann ich auf dem i5 klar erkennen, dass es keinen Unterschied in Bezug auf Leistung, aktiviert oder deaktiviert gibt. Schließlich scheint die alte Überprüfung auf zusätzliche CPU-Anweisungen im Fehlerbericht behoben worden zu sein. Ich sehe nichts Schlüssiges, um zu sehen, warum die ältere CPU nicht unterstützt wird. Mit dem 7-fachen Anstieg: Das war Java 8 mit i5 32 Bit und neueren i7 Bit. Immer noch riesige Steigerung für die gleiche Klasse Bytes :) –

+0

Oh, und der i7 schien etwa doppelt so schnell wie der i5 für normale Anwendungen (ich habe C++ Kompilation speziell getestet), die viel schneller ist, aber nicht eine 7-fache Lücke durch ein langer Weg. Beachten Sie, dass 64-Bit-optimierte Anwendungen möglicherweise eine * zusätzliche * Beschleunigung erhalten. Diese neueren CPUs machen einen Unterschied, denke ich. –

+0

Okay. Macht Sinn. In meinen eigenen Tests scheinen die AES-Flaggen nicht geehrt zu werden. Egal, ob ich die Flags aktiviere oder deaktiviere, die Ausführungszeiten sind gleich. Wenn wir also den tatsächlichen Unterschied benötigen, der durch die CPU-Unterstützung entsteht, benötigen wir möglicherweise identische CPUs - eine mit deaktiviertem AES-NI und eine andere mit aktiviertem. Ein Typ hier hat einige interessante Ergebnisse (nicht Java), mit Kernel deaktivieren AES-NI: https://ask.fedoraproject.org/en/question/29298/how-can-i-verify-that-my-luks-will -utilize-aes-ni-encryption-support-in-my-system/ Seine Ergebnisse sind sehr nahe bei Ihnen (7x in vielen Fällen) – user30622

Verwandte Themen