On Sun, 3 Oct 2021 18:20:29 GMT, Daniel Jeliński 
<github.com+30433125+djelin...@openjdk.org> wrote:

>> Hi,
>> 
>> We have identified that the `HandshakeContext` initialization takes up a 
>> close to 50% of the flame graph for startHandshake. I have moved the 
>> computation of the `activeProtocols` and `activeCipherSuites` from the 
>> HandshakeContext constructor to SSLConfiguration class because the values 
>> used to compute the two list are available in the SSLConfiguration. 
>> 
>> In order to reuse this, I have initialized SSLConfiguration in the 
>> SSLSocketFactory and reused this when possible for Client Socket 
>> Constructors in the SSLSocketImpl. 
>> 
>> Sockets created from the SSLSocketFactory see this improvements. 
>> 
>> Old Benchmarks
>> 
>> Benchmark                                   Mode  Cnt  Score   Error   Units
>> SSLStartHandshake.handshakeBenchmark       thrpt   25  0.247 ± 0.011  ops/ms
>> SSLStartHandshake.handshakeBenchmark        avgt   25  4.210 ± 0.445   ms/op
>> 
>> New Benchmarks
>> 
>> SSLStartHandshake.handshakeBenchmark       thrpt   25  0.257 ± 0.017  ops/ms
>> SSLStartHandshake.handshakeBenchmark        avgt   25  3.967 ± 0.208   ms/op
>> 
>> 
>> 
>> I have also attached the JFR profiles from before and after the change.
>> Before
>> <img width="2325" alt="SSLOverhead-old" 
>> src="https://user-images.githubusercontent.com/934461/135705010-a8502966-c6be-4cb5-b743-4a5b382c8e1f.png";>
>> 
>> After 
>> <img width="2310" alt="SSLOverhead-new" 
>> src="https://user-images.githubusercontent.com/934461/135705007-ea852b36-e10f-4741-a166-249270b34465.png";>
>>  
>> We have been able to optimize the `TransportContext.kickstart` function by 
>> removing the `HandshakeContext.<init>`  initialization and reduce the time 
>> to start the handshake by reusing `activeProtocols` and `activeCipherSuites`
>> 
>> In addition to the SSL and http tests, I have run tier-1 and tier-2 tests 
>> and ensure that they pass. 
>> 
>> Looking for your feedback
>
> I quickly hacked together a SSLEngine benchmark for server-side handshakes 
> [here](https://github.com/djelinski/jdk/blob/2bee5c471b41d60d4248d5d16e868060f0efda19/test/micro/org/openjdk/bench/java/security/SSLEngineStartHandshake.java);
>  note that on the server side I run the following code on every connection;
> 
>             SSLEngine serverEngine = context.createSSLEngine();
>             serverEngine.setUseClientMode(false);
>             serverEngine.setEnabledProtocols(new String[]{"TLSv1.3"});
>             serverEngine.setEnabledCipherSuites(new 
> String[]{"TLS_AES_256_GCM_SHA384"});
>             serverEngine.beginHandshake();
> 
> not sure if that's the best way to initialize SSLEngine. Anyway, in this 
> setup I observed a 16% performance degradation; results without your patch:
> 
> Benchmark                                         Mode  Cnt  Score   Error   
> Units
> SSLEngineStartHandshake.handshakeBenchmark       thrpt   25  0.837 ± 0.006  
> ops/ms
> SSLEngineStartHandshake.handshakeBenchmark        avgt   25  1.187 ± 0.006   
> ms/op
> 
> with your patch:
> 
> Benchmark                                         Mode  Cnt  Score   Error   
> Units
> SSLEngineStartHandshake.handshakeBenchmark       thrpt   25  0.702 ± 0.009  
> ops/ms
> SSLEngineStartHandshake.handshakeBenchmark        avgt   25  1.416 ± 0.013   
> ms/op

Hi @djelinski 

Thank you for putting this together. I will investigate the results of your 
benchmarks.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5793

Reply via email to