RFR: 8259886 : Improve SSL session cache performance and scalability [v2]

djelinski github.com+30433125+djelinski at openjdk.java.net
Tue Mar 2 21:19:52 UTC 2021


On Mon, 22 Feb 2021 21:31:21 GMT, Xue-Lei Andrew Fan <xuelei at openjdk.org> wrote:

>> Actually there's a much easier solution to reduce the number of slow `put()`s without making any behavioral changes.
>> The cache object could store the earliest expire time, and then exit `expungeExpiredEntries()` early when current time is earlier than the earliest expire time - when it is, we know that there are no expired items in the queue and we can skip the scan entirely.
>> @XueleiFan do you think the above is worth exploring?
>
>> Actually there's a much easier solution to reduce the number of slow `put()`s without making any behavioral changes.
>> The cache object could store the earliest expire time, and then exit `expungeExpiredEntries()` early when current time is earlier than the earliest expire time - when it is, we know that there are no expired items in the queue and we can skip the scan entirely.
>> @XueleiFan do you think the above is worth exploring?
> 
> Definitely, I think it is a good improvement.  Actually, it is a surprise to me that the current code is not working this way.
> 
> Sorry, I was/am on vacation, and the review could be delayed for a few days.

I reverted all earlier Cache changes, and added a new commit that caches the earliest expire time of all cached items. The observable behavior of the new code is identical to original - items are removed from cache at exactly the same time as before; we only skip scanning the cache when we know that there are no expired items inside.

The performance is substantially improved. There can be at most `cache size` scans in every `cache lifetime` period, which is roughly one scan every 4 seconds with the default SSL session cache settings. This is much better than possibly scanning on every `put()` that was possible before the changes.

My reduced set of benchmarks produced the following values:
Benchmark       (size)  (timeout)  Mode  Cnt    Score   Error  Units
CacheBench.put   20480      86400  avgt   25  148.345 ? 1.970  ns/op
CacheBench.put   20480          0  avgt   25  108.598 ? 3.787  ns/op
CacheBench.put  204800      86400  avgt   25  151.318 ? 1.872  ns/op
CacheBench.put  204800          0  avgt   25  106.650 ? 1.080  ns/op 
which is comparable to what was observed with the previous commits.

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

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



More information about the build-dev mailing list