RFR: JDK-8086056: ParNew: auto-tune ParGCCardsPerStrideChunk

Bengt Rutisson bengt.rutisson at oracle.com
Thu Jun 25 08:02:48 UTC 2015


Hi Tony,

No worries about the delay, I'm also quite busy with other things here. ;)

On 2015-06-24 20:41, Tony Printezis wrote:
> New webrev that covers all the suggestions:
>
> http://cr.openjdk.java.net/~tonyp/8086056/webrev.1/ 
> <http://cr.openjdk.java.net/%7Etonyp/8086056/webrev.1/>

Thanks for providing a new webrev!

Some comments:

parNewGeneration.cpp

The flag validation code on lines 886-912 can be replaced by the 
recently added support for command line verification. See JEP-245:

JEP 245: Validate JVM Command-Line Flag Arguments
http://openjdk.java.net/jeps/245
http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/rev/5bbf25472731

You can simply specify a constraint function in the definition of the 
flags in globals.hpp.


I have a very hard time following all the type conversions going on in 
adjust_cards_per_stride().

The capacity flags are size_t, the DynamicParGCStrides[Min/Max]Size 
flags are uintx, we then convert the result through intptr_t, int and 
uintx to eventually assign back to ParGCCardsPerStrideChunk as intx. The 
value of ParGCCardsPerStrideChunk is then used in the code to offset 
pointers of the jbyte* type. How can we be sure that this works correctly?


globalDefinitions.hpp

I don't think that globalDefinitions.hpp is the right place to put 
linearly_interpolate_bounded(). I would prefer to have it as a local 
method in parNewGeneration.cpp. Or if you think it is actually going to 
be used more widely I think it should go somewhere in the utilities/ 
directory.

Does it really make sense to use different types for X and Y in 
linearly_interpolate_bounded()? I would think that one type is enough. 
Also, it does not look safe to just cast the type to double for a 
general purpose template method.

Thanks,
Bengt

>
> (and I also found a version of hg that works OK with webrev; thanks to 
> Jon Masa for the help)
>
> I’m not really happy with the way I deal with the 32-bit case. Better 
> suggestions are welcome. Also, I’m not attached to what the cmd line 
> args are called. Better suggestions on that are welcome too.
>
> Tony
>
> On June 23, 2015 at 12:19:12 PM, Tony Printezis 
> (tprintezis at twitter.com <mailto:tprintezis at twitter.com>) wrote:
>
>> Hi Bengt,
>>
>> I’ll try factoring out the interpolation and tell me what you think. 
>> Sorry, I’m a bit behind on this as I’ve been busy with a couple of 
>> more urgent tasks hee. I’ll get this done shortly.
>>
>> Tony
>>
>> On June 22, 2015 at 3:36:10 AM, Bengt Rutisson 
>> (bengt.rutisson at oracle.com <mailto:bengt.rutisson at oracle.com>) wrote:
>>
>>>
>>> Hi Tony,
>>>
>>> I agree with your comments. Thanks for fixing this!
>>>
>>> One answer at the end of this message...
>>>
>>> On 2015-06-18 15:50, Tony Printezis wrote:
>>>> Hi Bengt,
>>>>
>>>> Thanks for looking at it. Inline.
>>>>
>>>> On June 18, 2015 at 3:02:45 AM, Bengt Rutisson 
>>>> (bengt.rutisson at oracle.com <mailto:bengt.rutisson at oracle.com>) wrote:
>>>>
>>>>>
>>>>> Hi Tony,
>>>>>
>>>>> NIce to hear from you!
>>>>>
>>>>>
>>>>> On 18/06/15 00:30, Tony Printezis wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> A small patch for your consideration:
>>>>>>
>>>>>> http://cr.openjdk.java.net/~tonyp/8086056/webrev.0/ 
>>>>>> <http://cr.openjdk.java.net/%7Etonyp/8086056/webrev.0/>
>>>>>
>>>>> A couple of style comments:
>>>>>
>>>>>  891   const size_t MinOldGenCapacity =      G;
>>>>>  892   const size_t MaxOldGenCapacity = 16 * G;
>>>>>  893   assert(MinOldGenCapacity <= MaxOldGenCapacity, "sanity");
>>>>>
>>>>> Local variables are normmaly named using lower case and underscore.
>>>>
>>>>
>>>> Yeah, I of course usually do that. But as they are constants I 
>>>> thought I’d make them look like constants. :-)
>>>>
>>>>
>>>>> So, min_old_gen_capacity and max_old_gen_capacity. Same for the 
>>>>> rest of the local variables in 
>>>>> ParNewGeneration::adjust_cards_per_stride().
>>>>>
>>>>> Having said that, I think it would be good to turn some of these 
>>>>> constants into flags (which means that the naming should be as it 
>>>>> is now ;) ).
>>>>
>>>>
>>>> Hang on! Are you and Masa encourating me to add 5 (!!!) more cmd 
>>>> line args to HotSpot? ;-)
>>>>
>>>>
>>>>> Especially since you say that you haven't done much performance 
>>>>> testing of these values.
>>>>
>>>>
>>>> To be clear: I did performance testing with chunks sizes in the 
>>>> 256-8k range and with three old gen sizes (2g, 10g, and 20g) and 
>>>> auto-tuning comes pretty close to optimal; I have numbers on the 
>>>> JIRA. But, yes, that was only with a couple of (synthetic) tests 
>>>> and only on one architecture (Linux/x64). If someone there could 
>>>> try this on a couple more apps and maybe on sparc, as we don’t 
>>>> happen to have any sparc boxes lying around :-), it’d be helpful.
>>>>
>>>> But, yes, your suggestion of making the chunk size / old gen 
>>>> capacity limits into cmd line args definitely makes sense and I had 
>>>> also considered that myself. But I had decided against it as I 
>>>> thought you wouldn’t want more cmd line args. :-) How about:
>>>>
>>>> +UseDynamicParGCStrides
>>>>
>>>> DynamicParGCStrides{Min,Max}OldGenCapacity
>>>>
>>>> DynamicParGCStrides{Min,Max}Size
>>>>
>>>> I should also make them all manageable.
>>>>
>>>>
>>>>> I would prefer that we could adjust them at runtime. Best would of 
>>>>> course be if you could take the time to do the performance testing.
>>>>
>>>>
>>>> So, as I said earlier, I did. The numbers are on the JIRA. Is there 
>>>> anything else I could maybe run? Maybe larger old gen than 20g? 
>>>> (but that’s reaching the memory limits of my workstation, FWIW)
>>>>
>>>>
>>>>>
>>>>> I realize that the assert on line 893 might have been useful if 
>>>>> you were playing around with the numbers when you were 
>>>>> experimenting with the patch. But now it looks mostly like line 
>>>>> noise to me. Same with the assert on line 898.
>>>>
>>>>
>>>> Actually, it as basically stating the invariant for those 
>>>> parameters (in case someone wants to play around with them). But if 
>>>> we make the constants into cmd line args this will go away...
>>>>
>>>>
>>>>>
>>>>> I would also consider factoring the actual computation out into a 
>>>>> separate helper method.
>>>>
>>>>
>>>> You mean the interpolation? Like:
>>>>
>>>> (base_min, base_max, value_min, value_max, value) -> result in 
>>>> range [base_min, base_max]?
>>>>
>>>
>>> Yes, that's what I meant. But if you, as suggested above, get rid of 
>>> most (all?) of the constant definitions in adjust_cards_per_stride() 
>>> then I guess it is mostly only the interpolation left. So, in that 
>>> case it may not be necessary to factor it out. I would have to see a 
>>> new webrev to have more comments.
>>>
>>> Thanks,
>>> Bengt
>>>
>>>> Tony
>>>>
>>>>
>>>>>
>>>>> I also second Jon's comment on that it would be good with a more 
>>>>> explicit way of turning this feature off.
>>>>>
>>>>> Thanks,
>>>>> Bengt
>>>>>
>>>>>>
>>>>>> (BTW, for some reason some of the webrev output is a bit messed 
>>>>>> up. Not sure why, maybe some hg incompatibility I guess. The 
>>>>>> diffs look OK though. I also attached the patch to this e-mail.)
>>>>>>
>>>>>> There’s a bit of info on the JIRA on the rationale for the patch:
>>>>>>
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8086056
>>>>>>
>>>>>> The min / max values for the old gen capacity 
>>>>>> and ParGCCardsPerStrideChunk were chosen empircally after running 
>>>>>> a few (mostly synthetic tests) on Linux x64. If someone has the 
>>>>>> cycles to do a more extensive performance study, I’d be happy to 
>>>>>> revise them accordingly.
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Tony
>>>>>>
>>>>>> -----
>>>>>>
>>>>>> Tony Printezis | JVM/GC Engineer / VM Team | Twitter
>>>>>>
>>>>>> @TonyPrintezis
>>>>>> tprintezis at twitter.com <mailto:tprintezis at twitter.com>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> -----
>>>>
>>>> Tony Printezis | JVM/GC Engineer / VM Team | Twitter
>>>>
>>>> @TonyPrintezis
>>>> tprintezis at twitter.com <mailto:tprintezis at twitter.com>
>>>>
>>>
>> -----
>>
>> Tony Printezis | JVM/GC Engineer / VM Team | Twitter
>>
>> @TonyPrintezis
>> tprintezis at twitter.com <mailto:tprintezis at twitter.com>
>>
> -----
>
> Tony Printezis | JVM/GC Engineer / VM Team | Twitter
>
> @TonyPrintezis
> tprintezis at twitter.com <mailto:tprintezis at twitter.com>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/attachments/20150625/3a1ee7a2/attachment-0001.html>


More information about the hotspot-gc-dev mailing list