RFR: 8220795: Introduce TimedYield utility to improve time-to-safepoint on Windows
David Holmes
david.holmes at oracle.com
Thu Apr 25 08:44:55 UTC 2019
+1
Thanks,
David
On 25/04/2019 5:13 pm, Robbin Ehn wrote:
> Still good, thanks!
>
> /Robbin
>
> On 4/24/19 3:12 PM, Robin Westberg wrote:
>> Hi David,
>>
>>> On 23 Apr 2019, at 03:39, David Holmes <david.holmes at oracle.com> wrote:
>>>
>>> Hi Robin,
>>>
>>> Sorry, now Easter break got in the way :)
>>>
>>> <trimming>
>>>
>>> On 17/04/2019 11:55 pm, Robin Westberg wrote:
>>>>> On 12 Apr 2019, at 11:15, David Holmes <david.holmes at oracle.com>
>>>>> wrote:
>>>>> I'd prefer to fix a windows problem, just on windows. I'm not hung
>>>>> up on having sleep in the name, but if you prefer timed_yield to
>>>>> naked_short_nanosleep then that's fine (and avoids people wondering
>>>>> what the "naked" part means).
>>>>>
>>>>> If we need the TimedYield capability in the future then lets
>>>>> revisit that then.
>>>> Sure, here’s a lighter version of this change that changes the
>>>> Windows implementation of naked_short_nanosleep, with a few
>>>> adjustments to some assumptions in the waiting-for-safepoint backoff
>>>> strategy.
>>>> Still passes tier1, with the same performance improvements on
>>>> Windows (and no obvious regressions on Linux).
>>>> New webrev:
>>>> https://cr.openjdk.java.net/~rwestberg/8220795/webrev.02/
>>>
>>> Windows changes look fine - thanks.
>>>
>>> Safepoint backoff change seems okay but what affect does it have on
>>> performance on non-Windows? (javaTimeNanos can sometimes be expensive)
>>
>> In the case where we have to wait for threads to stop it shouldn't
>> matter, it will be insignificant compared to the time spent actually
>> sleeping. But in the case where all threads manage to stop before we
>> resort to waiting there is indeed an unnecessary call to javaTimeNanos
>> - I have not observed any measurable difference, but I’ve reworked the
>> code a little bit to avoid this just in case:
>>
>> Full webrev: https://cr.openjdk.java.net/~rwestberg/8220795/webrev.03/
>> Incremental: https://cr.openjdk.java.net/~rwestberg/8220795/webrev.02-03/
>>
>> Best regards,
>> Robin
>>
>>>
>>> Thanks,
>>> David
>>>
>>>> Best regards,
>>>> Robin
>>>>>
>>>>> Thanks,
>>>>> David
>>>>> -----
>>>>>
>>>>>> Best regards,
>>>>>> Robin
>>>>>>>
>>>>>>> ?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> David
>>>>>>> -----
>>>>>>>
>>>>>>>
>>>>>>>> Best regards,
>>>>>>>> Robin
>>>>>>>>> On 5 Apr 2019, at 13:54, Robin Westberg
>>>>>>>>> <robin.westberg at oracle.com> wrote:
>>>>>>>>>
>>>>>>>>> Hi David,
>>>>>>>>>
>>>>>>>>>> On 5 Apr 2019, at 12:10, David Holmes
>>>>>>>>>> <david.holmes at oracle.com> wrote:
>>>>>>>>>>
>>>>>>>>>> On 5/04/2019 7:53 pm, Robin Westberg wrote:
>>>>>>>>>>> Hi David,
>>>>>>>>>>> Thanks for taking a look!
>>>>>>>>>>>> On 5 Apr 2019, at 10:49, David Holmes
>>>>>>>>>>>> <david.holmes at oracle.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Hi Robin,
>>>>>>>>>>>>
>>>>>>>>>>>> On 5/04/2019 6:05 pm, Robin Westberg wrote:
>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>> Please review the following change that modifies the way
>>>>>>>>>>>>> safepointing waits for other threads to stop. As part of
>>>>>>>>>>>>> JDK-8203469, os::naked_short_nanosleep was used for all
>>>>>>>>>>>>> platforms. However, on Windows, this function has
>>>>>>>>>>>>> millisecond granularity which is too coarse and caused
>>>>>>>>>>>>> performance regressions. Instead, we can take advantage of
>>>>>>>>>>>>> the fact that Windows can tell us if anyone else is waiting
>>>>>>>>>>>>> to run on the current cpu. For other platforms the original
>>>>>>>>>>>>> waiting is used.
>>>>>>>>>>>>
>>>>>>>>>>>> Can't you just make the new code the implementation of
>>>>>>>>>>>> os::naked_short_nanosleep on Windows and avoid adding yet
>>>>>>>>>>>> another sleep/yield abstraction? If Windows nanosleep only
>>>>>>>>>>>> has millisecond granularity then it's broken.
>>>>>>>>>>> Right, I considered that approach, but it's not obvious to me
>>>>>>>>>>> what semantics would be appropriate for that. Depending on
>>>>>>>>>>> whether you want an accurate sleep or want other threads to
>>>>>>>>>>> make progress, it could conceivably be either implemented as
>>>>>>>>>>> pure spinning, or spinning combined with yielding (either
>>>>>>>>>>> cpu-local or Sleep(0)-style).
>>>>>>>>>>> That said, perhaps os_naked_short_nanosleep should be
>>>>>>>>>>> removed, the only remaining usage is in spinYield, which
>>>>>>>>>>> turns to sleeping after giving up on yielding. For windows,
>>>>>>>>>>> it may be more appropriate to switch to Sleep(0) in that case.
>>>>>>>>>>
>>>>>>>>>> I definitely don't think we need to introduce another
>>>>>>>>>> abstraction (though I'm okay with replacing one with a new one).
>>>>>>>>>
>>>>>>>>> Okay, then I’d prefer to drop the os::naked_short_nanosleep. As
>>>>>>>>> I see it, you would use SpinYield when waiting for something
>>>>>>>>> like a CAS race, and TimedYield when waiting for a thread
>>>>>>>>> rendezvous.
>>>>>>>>>
>>>>>>>>> I did try to make TimedYield into a different “policy” for the
>>>>>>>>> existing SpinYield class at first, but didn’t quite feel like I
>>>>>>>>> found a nice API for it. So perhaps it's fine to just have them
>>>>>>>>> as separate classes.
>>>>>>>>>
>>>>>>>>>> It was probably discussed at the time but the
>>>>>>>>>> naked_short_nanosleep on Windows definitely seems to have far
>>>>>>>>>> too much overhead - even having to create a new waitable-timer
>>>>>>>>>> each time. Do we know if the overhead is actually the
>>>>>>>>>> resolution of the timer or whether it's all the extra work
>>>>>>>>>> that method needs to do? I should try to dig up the email on
>>>>>>>>>> that. :)
>>>>>>>>>
>>>>>>>>> Yes, as far as I know the best possible sleep resolution you
>>>>>>>>> can obtain on Windows is one millisecond (perhaps 0.5ms in
>>>>>>>>> theory if you go directly for NtSetTimerResolution). The
>>>>>>>>> SetWaitableTimer approach is the best though to actually obtain
>>>>>>>>> 1ms resolution, plain Sleep(1) usually sleeps around 2ms.
>>>>>>>>>
>>>>>>>>> Best regards,
>>>>>>>>> Robin
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> David
>>>>>>>>>>
>>>>>>>>>>> Best regards,
>>>>>>>>>>> Robin
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> David
>>>>>>>>>>>> -----
>>>>>>>>>>>>
>>>>>>>>>>>>> Various benchmarks (specjbb2015, specjm2008) show better
>>>>>>>>>>>>> numbers for Windows and no regressions for Linux.
>>>>>>>>>>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8220795
>>>>>>>>>>>>> Webrev:
>>>>>>>>>>>>> http://cr.openjdk.java.net/~rwestberg/8220795/webrev.00/
>>>>>>>>>>>>> Testing: tier1
>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>> Robin
>>
More information about the hotspot-runtime-dev
mailing list