RFR: 8274308: Improve efficiency for HandshakeContext initialization.

Clive Verghese cverghese at openjdk.java.net
Fri Oct 29 23:58:08 UTC 2021


On Sat, 2 Oct 2021 05:45:47 GMT, Clive Verghese <cverghese at 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

Hi, I have update the PR with an alternate implementation. 

The updated benchmark results are 

New Benchmarks 

Benchmark                                         Mode  Cnt  Score   Error   Units
SSLStartHandshake.handshakeBenchmark             thrpt   25  0.241 ± 0.016  ops/ms
SSLStartHandshake.handshakeBenchmark              avgt   25  4.010 ± 0.224   ms/op
SSLEngineStartHandshake.handshakeBenchmark       thrpt   25  0.642 ± 0.021  ops/ms
SSLEngineStartHandshake.handshakeBenchmark        avgt   25  1.552 ± 0.058   ms/op


Old Benchmarks

Benchmark                                         Mode  Cnt  Score   Error   Units
SSLStartHandshake.handshakeBenchmark             thrpt   25  0.229 ± 0.010  ops/ms
SSLStartHandshake.handshakeBenchmark              avgt   25  4.375 ± 0.283   ms/op
SSLEngineStartHandshake.handshakeBenchmark       thrpt   25  0.621 ± 0.035  ops/ms
SSLEngineStartHandshake.handshakeBenchmark        avgt   25  1.830 ± 0.406   ms/op


This new implementation uses a cache in the HandshakeContext class. 

Looking forward for you feedback.

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

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



More information about the security-dev mailing list