RFR (S/M): 8136678: Implement adaptive sizing algorithm for IHOP
Mikael Gerdin
mikael.gerdin at oracle.com
Fri Nov 20 16:32:49 UTC 2015
On 2015-11-20 16:56, Mikael Gerdin wrote:
> On 2015-11-13 13:16, Thomas Schatzl wrote:
>> Hi all,
>>
>> I would like to ask again for reviews of this change. Since
>> particularly at this time code changes are frequent, keeping it up to
>> date poses a significant burden.
>>
>> Also, after some more performance testing I got some feedback that it
>> might be better that the number of completed marking rounds before
>> actually starting to adaptively size the IHOP can be configured.
>>
>> On application with large heaps it can take quite a while until the
>> required number of completed rounds can be reached. People would be fine
>> with a non-optimal prediction (very conservative) at the start.
>>
>> I added an option G1AdaptiveIHOPNumInitialSamples which by default
>> behaves the same as before (requiring three completed markings plus a
>> single mixed gc) to allow that tuning.
>>
>> The webrevs were update in place at
>> http://cr.openjdk.java.net/~tschatzl/8136678/webrev.0_to_1/ (diff)
>> http://cr.openjdk.java.net/~tschatzl/8136678/webrev.1/ (full)
>
> g1IHOPControl.hpp
>
> 109 G1Predictions const * _predictor;
>
> 133 G1AdaptiveIHOPControl(double ihop_percent,
> 134 size_t initial_target_occupancy,
> 135 G1Predictions const* predictor,
>
> Did you mean "const G1Predictions* _predictor" here?
> It only appears to call const methods on the G1Predictions object.
>
> In theory I suppose that we could have a const* _predictor but since
> almost no other part of the code use "const* ptr" to signal that a
> pointer is not modified it feels a bit strange to use it here.
> A "const Predictor*" would instead signal that the code does not modify
> the internal state of the Predictor.
Erik pointed out to me that
G1Predictions const* is not G1Predictions *const which is how I read it.
I'd much prefer to keep the "const" before the type name since the
majority of the code base looks like that.
/Mikael
>
>
> g1IHOPControl.cpp
>
> 119 _marking_times_s(10, 0.95),
> 120 _allocation_rate_s(10, 0.95),
> Would you mind making these named constants? The 10 is the same as the
> truncated seq length in G1CollectorPolicy but the 0.95 is not the
> standard "alpha" value, would it make sense to describe what 0.95 comes
> from?
>
> 138 return MIN2(
> 139 G1CollectedHeap::heap()->max_capacity() * (100.0 -
> safe_total_heap_percentage) / 100.0,
> 140 _target_occupancy * (100.0 - _heap_waste_percent) / 100.0
> 141 );
>
> Would it make sense to cache the initial target occupancy (which is
> max_capacity()) and use that instead of looking it up through the G1CH?
>
> Another approach would be to make _target_occupancy (which is
> initialized to max_capacity()) a constant in the base class and use
> another member in the adaptive ihop class for set_target_occupancy (for
> which I suppose you have a purpose?).
>
> /Mikael
>
>>
>> since I did not receive any feedback on the code changes themselves.
>>
>> Thanks,
>> Thomas
>>
>> On Fri, 2015-11-06 at 11:42 +0100, Thomas Schatzl wrote:
>>> Hi all,
>>>
>>> after Sangheon's recent comment about potential division by zero, I
>>> went through this change and also fixed this here.
>>>
>>> Also, the output printed the wrong numbers (i.e.
>>> _allocation_rate_s.last() vs. _allocation_rate_s.oldest()).
>>>
>>> New webrevs:
>>> http://cr.openjdk.java.net/~tschatzl/8136678/webrev.0_to_1/ (diff)
>>> http://cr.openjdk.java.net/~tschatzl/8136678/webrev.1/ (full)
>>>
>>> Thanks,
>>> Thomas
>>>
>>> On Thu, 2015-11-05 at 10:54 +0100, Thomas Schatzl wrote:
>>>> Hi all,
>>>>
>>>> can I have reviews for this change that adds a G1IHOPControl
>>>> instance
>>>> that adaptively adjusts the current IHOP based on allocation rate and
>>>> marking cycle length?
>>>>
>>>> Instead of statically setting the IHOP value (by the user at VM
>>>> startup), this change adds adaptive IHOP control similar to CMS.
>>>>
>>>> The main change is in G1IHOPControl lines 106-121, the rest is just
>>>> setup changes and a unit test.
>>>>
>>>> This feature, enabled by setting G1UseAdaptiveIHOP, is disabled by
>>>> default for now. It is planned to be enabled by default in JDK-8136680,
>>>> when more thorough testing has been conducted by SQE.
>>>>
>>>> Generally it boosts G1 throughput significantly due to the low IHOP
>>>> default value of 45, which with that change typically gets >70, if not
>>>> up to 80-90, decreasing pause times significantly.
>>>>
>>>> It depends on JDK-8136681 which is also out for review.
>>>>
>>>> CR:
>>>> https://bugs.openjdk.java.net/browse/JDK-8136678
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~tschatzl/8136678/webrev/
>>>> Testing:
>>>> jprt, vm.gc with G1UseAdaptiveIHOP disabled and enabled, unit test
>>>>
>>>> Thanks,
>>>> Thomas
>>>>
>>>>
>>>
>>>
>>
>>
>
More information about the hotspot-gc-dev
mailing list