RFR(S) 8021335: Missing synchronization when reading counters for live threads and peak thread count

David Holmes david.holmes at oracle.com
Wed Oct 24 05:34:03 UTC 2018


On 24/10/2018 8:30 AM, dean.long at oracle.com wrote:
> On 10/23/18 2:51 PM, David Holmes wrote:
>> Hi Dean,
>>
>> On 24/10/2018 4:05 AM, dean.long at oracle.com wrote:
>>> On 10/23/18 9:46 AM, dean.long at oracle.com wrote:
>>>> On 10/22/18 3:31 PM, David Holmes wrote:
>>>>> Sorry Dean I'm concerned about a thread termination bottleneck with 
>>>>> this. A simple microbenchmark that creates 500,000 threads that 
>>>>> have to run and terminate, shows a 15+% slowdown on my Linux box. I 
>>>>> tried to find some kind of real benchmarks that covers thread 
>>>>> termination but couldn't see anything specific.
>>>>>
>>>>> Can you at least run this through our performance system to see if 
>>>>> any of the regular benchmarks are affected.
>>>>>
>>>>
>>>> OK, but even if the regular benchmarks don't show a difference, I'd 
>>>> feel better if microbenchmarks were not affected.  What if I go back 
>>>> to the original approach and add locking:
>>>>
>>>>    static jlong get_live_thread_count()        { MutexLocker 
>>>> mu(Threads_lock); return _live_threads_count->get_value() - 
>>>> _exiting_threads_count; }
>>>>    static jlong get_daemon_thread_count()      { MutexLocker 
>>>> mu(Threads_lock); return _daemon_threads_count->get_value() - 
>>>> _exiting_daemon_threads_count; }
>>>>
>>>> along with the other cleanups around is_daemon and is_hidden_thread?
>>>>
>>>
>>> Some micro-benchmarks like SecureRandomBench show a regression with 
>>> webrev.7.  I could go back to webrev.5 and then we shouldn't need any 
>>> locking in the get_*() functions.
>>
>> I don't see version 5 discussed but I took a look and it seems okay. 
> 
> Mandy had questions about the asserts in .5, and it seemed like we could 
> just set the perf counters to the same value as the atomic counters, 
> which resulted in .6.  I think the only problem with .6 is that I set 
> the perf counters in decrement_thread_counts without the lock.  If I 
> "sync" the perf counters to the atomic counters only in add_thread and 
> remove_thread, with the lock, then it's about the same as .5, but 
> without the asserts and parallel inc/dec.  If anyone likes the sound of 
> that, I can send out a new webrev.  Or we can go with webrev.5.

I'm not sure what the concern was with the asserts - if they mis-fire 
we'll know soon enough. So I'm okay with .5

>> My only query with that version is that it appears the actual 
>> perfCounters no longer get read by anything - is that the case?
>>
> 
> There does seem to be code that references them, through their name 
> string.  That's a difference interface that I'm not familiar with, so I 
> didn't want to break it.

Right - they can be accessed directly through other means. I was 
concerned that the perfCounter was out of sync with 
get_live_thread-count() but that's already the case so not an issue.

If all tests and benchmarks are happy I say go with version .5

Thanks,
David

> dl
> 
>> Thanks,
>> David
>>
>>> dl
>>>
>>>> dl
>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>> On 20/10/2018 1:28 PM, dean.long at oracle.com wrote:
>>>>>> On 10/18/18 6:12 PM, Mandy Chung wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 10/18/18 12:27 AM, David Holmes wrote:
>>>>>>>> Hi Dean,
>>>>>>>>
>>>>>>>> On 18/10/2018 2:06 PM, dean.long at oracle.com wrote:
>>>>>>>>>
>>>>>>>>> You're right, I missed that.  I think the right thing to do is 
>>>>>>>>> call current_thread_exiting while holding the Threads_lock.
>>>>>>>>> Then we can get rid of the parallel atomic counters. So, here's 
>>>>>>>>> one more try:
>>>>>>>>>
>>>>>>>>> http://cr.openjdk.java.net/~dlong/8021335/webrev.7/
>>>>>>>>
>>>>>>>> Okay that is the simple and obvious solution that doesn't 
>>>>>>>> require split counts. So I have to ask Mandy if she recalls why 
>>>>>>>> this approach wasn't taken 15 years ago when the exit counts 
>>>>>>>> were added as part of:
>>>>>>>>
>>>>>>>
>>>>>>> It has been so long.  I think it's likely an oversight.
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-4530538 ?
>>>>>>>>
>>>>>>>> Does taking the Threads_lock here cost too much and cause a 
>>>>>>>> thread termination bottleneck?
>>>>>>>
>>>>>>> If the contention on Threads_lock is not high (that seems to me), 
>>>>>>> it should be okay.   I'm not close to the VM implementation (lot 
>>>>>>> of changes since then) and I don't have a definitive answer 
>>>>>>> unless I study the code closely.   You and others have a better 
>>>>>>> judgement on this.
>>>>>>>
>>>>>>> AFAICT the change is okay.
>>>>>>>
>>>>>>
>>>>>> Thanks Mandy.  David, OK to push?
>>>>>>
>>>>>> dl
>>>>>>
>>>>>>> Mandy
>>>>>>>
>>>>>>>
>>>>>>
>>>>
>>>
> 


More information about the hotspot-dev mailing list