<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style></head><body lang=DE link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hello,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>and to partially answer myself: the UnlockDiagnostics is needed for Java 9+ </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Gruss</p><p class=MsoNormal>Bernd</p><p class=MsoNormal>-- <br>http://bernd.eckenfels.net</p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>Von: </b><a href="mailto:anthony.scarpino@oracle.com">Anthony Scarpino</a><br><b>Gesendet: </b>Montag, 3. Dezember 2018 21:37<br><b>An: </b><a href="mailto:ecki@zusammenkunft.net">Bernd Eckenfels</a>; <a href="mailto:security-dev@openjdk.java.net">security-dev@openjdk.java.net</a><br><b>Betreff: </b>Re: AES ctr benchmark performance<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Very slow.. Roughly 181k ops/sec vs 6100 ops/sec, for 16k datasize.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As far as why there is a switch, mostly debugging or possible bugs in <o:p></o:p></p><p class=MsoNormal>hotspot that cause the intrinsic to break.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Tony<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On 12/3/18 12:27 PM, Bernd Eckenfels wrote:<o:p></o:p></p><p class=MsoNormal>> Quick Question, why did you Need to switch it on and out of curiosity <o:p></o:p></p><p class=MsoNormal>> how do the times look like when you switch NI off?<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Greetings<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Bernd<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> -- <o:p></o:p></p><p class=MsoNormal>> http://bernd.eckenfels.net<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> *Von: *Anthony Scarpino <mailto:anthony.scarpino@oracle.com><o:p></o:p></p><p class=MsoNormal>> *Gesendet: *Montag, 3. Dezember 2018 21:13<o:p></o:p></p><p class=MsoNormal>> *An: *Kasper Janssens <mailto:Kasper.Janssens@wdc.com>; <o:p></o:p></p><p class=MsoNormal>> security-dev@openjdk.java.net <mailto:security-dev@openjdk.java.net><o:p></o:p></p><p class=MsoNormal>> *Betreff: *Re: AES ctr benchmark performance<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Hi,<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> That is how I read it, but when I've done the test it's closer to 55%.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> But openssl speed and jmh are not comparable. Openssl is only running<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> through it's algorithm, while jmh is running through the VM and java<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> byte code. jmh has to do more work outside of pure crypto ops than openssl.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Tony<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> On 12/3/18 12:09 AM, Kasper Janssens wrote:<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > Hello,<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > I've been measuring the performance of the java 11 built in AES-NI<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > instructions and, with NI switched on through JAVA_TOOL_OPTIONS =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > ‘-XX:+UnlockDiagnosticVMOptions -XX:+UseAES -XX:+UseAESIntrinsics’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > I run the benchmarks that are present in the open jdk itself through<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > ‘java -server -jar target/jmh-jdk-microbenchmarks-1.0-SNAPSHOT.jar<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > org.openjdk.bench.javax.crypto.full.AESBench.encrypt -p<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > algorithm=AES/CTR/NoPadding’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > When I compare the results and calculate the throughput in GB/s, for 16k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > encoding blocks, I get about 40% of the throughput when compared to the<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > openssl performance test through ‘openssl speed -evp aes-128-ctr’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > I don't seem to find a decent comparison/benchmark that describes which<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > percentage of the maximum performance to expect with jdk 11, but 40 %<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > seems rather low. Does anybody know of a comparison (or might have an<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > idea where I go wrong, because, as these are off the shelf perf tools I<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > would think not a lot can be tweaked there).<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > For reference, the openssl test reports this:<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > The 'numbers' are in 1000s of bytes per second processed.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > type 16 bytes 64 bytes 256 bytes 1024 bytes 8192<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > bytes 16384 bytes<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > aes-128-ctr 583576.76k 1907072.21k 4144141.40k 5612174.68k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > 6252751.53k 6258371.24k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > So, for 16k blocks, 6258371k bytes per second<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > The openjdk benchmark reports this<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > Benchmark (algorithm) (dataSize) (keyLength)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > (provider) Mode Cnt Score Error Units<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > AESBench.encrypt AES/CTR/NoPadding 16384<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > 128 thrpt 100 168066.873 ± 488.873 ops/s<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > Out of which I conclude that, for 16k blocks, the perf here is 168066 *<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > 16k or about 2689056k bytes per second or about 40 % of the openssl<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > number, taking some liberty with rounding the numbers.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > Is that expected or am I drawing the wrong conclusions? Or am I missing<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > something?<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > When I print the options, the jvm reports that the AES intrinsics are<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > being used :<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > java -XX:+PrintFlagsFinal | grep -i AES<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > intx MaxBCEAEstimateLevel =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > 5 {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > intx MaxBCEAEstimateSize =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > 150 {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > bool UseAES =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > true {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > System specs : Ubuntu 18.04<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > openjdk version "10.0.2" 2018-07-17<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > mode)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> > Kasper<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>