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

Changes requested by xuelei (Reviewer).

It looks like a good idea to make less computation for each handshake context.  
Thanks for that.  I have some concerns for the update, and see the comments 
above.

src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java line 57:

> 55:     AlgorithmConstraints        userSpecifiedAlgorithmConstraints;
> 56:     List<ProtocolVersion>       enabledProtocols;
> 57:     List<CipherSuite>           enabledCipherSuites;

What's the motivation to change enabledProtocols/CipherSuites to private?

src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java line 278:

> 276:                 this.enabledCipherSuites, this.algorithmConstraints);
> 277:         this.activeCipherSuites = 
> getActiveCipherSuites(this.activeProtocols,
> 278:                 this.enabledCipherSuites, this.algorithmConstraints);

Maybe a lazy set of activeProtocols could be better as setSSLParameters() may 
be called multiple times in practice.

src/java.base/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java line 47:

> 45: 
> 46:     private final SSLContextImpl context;
> 47:     private final SSLConfiguration configuration;

Share the mutable configuration within the instances created by the factory may 
be not a good idea.

src/java.base/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java line 173:

> 171:     {
> 172:         return new SSLSocketImpl(context, address, port,
> 173:                 clientAddress, clientPort, configuration);

Note that the configuration is used and shared for among socket instances, 
which may be not the expected behavior.

src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java line 174:

> 172:         HandshakeHash handshakeHash = new HandshakeHash();
> 173:         this.conContext = new TransportContext(sslContext, this,
> 174:                 sslConfiguration,

Sharing the mutable sslConfiguration for individual sockets may be not a good 
idea.

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

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

Reply via email to