Just update a new path, my preliminary measure show about 3.5x speedup of jmap 
histo on a nearly full 4GB G1 heap (8-core platform with parallel thread number 
set to 4). 
webrev: http://cr.openjdk.java.net/~lzang/jmap-8214535/8215624/webrev_02/
bug: https://bugs.openjdk.java.net/browse/JDK-8215624
CSR: https://bugs.openjdk.java.net/browse/JDK-8239290

BRs,
Lin

> On 2020/3/2, 9:56 PM, "linzang(臧琳)" <linz...@tencent.com> wrote:
>
>    Dear all, 
>          Let me try to ease the reviewing work by some explanation :P
>          The patch's target is to speed up jmap -histo for heap iteration, 
> from my experience it is necessary for large heap investigation. E.g in 
> bigData scenario I have tried to conduct jmap -histo against 180GB heap, it 
> does take quite a while. 
>          And if my understanding is corrent, even the jmap -histo without 
> "live" option does heap inspection with heap lock acquired. so it is very 
> likely to block mutator thread in allocation-sensitive scenario. I would say 
> the faster the heap inspection does, the shorter the mutator be blocked. This 
> is parallel iteration for jmap is necessary.
>          I think the parallel heap inspection should be applied to all kind 
> of heap. However, consider the heap layout are different for  GCs, much time 
> is required to understand all kinds of the heap layout to make the whole 
> change. IMO, It is not wise to have a huge patch for the whole solution at 
> once, and it is even harder to review it. So I plan to implement it 
> incrementally, the first patch (this one) is going to confirm the 
> implemention detail of how jmap accept the new option, passes it to 
> attachListener of the jvm process and then how to make the parallel 
> inspection closure be generic enough to make it easy to extend to different 
> heap layout. And also how to implement the heap inspection in specific gc's 
> heap. This patch use G1's heap as the begining.
>          This patch actually do several things:
>          1. Add an option "parallelThreadNum=<N>" to jmap -histo, the default 
> behavior is to set N to 0, means let's JVM decide how many threads to use for 
> heap inspection. Set this option to 1 will disable parallel heap inspection. 
> (more details in CSR: https://bugs.openjdk.java.net/browse/JDK-8239290)
>          2. Make a change in how Jmap passing arguments, changes in 
> http://cr.openjdk.java.net/~lzang/jmap-8214535/8215624/webrev_01/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java.udiff.html,
>  originally it pass options as separate arguments to attachListener, this 
> patch change to that all options be compose to a single string. So the 
> arg_count_max in attachListener.hpp do not need to be changed, and hence 
> avoid the compatibility issue, as disscussed at 
> https://mail.openjdk.java.net/pipermail/serviceability-dev/2019-March/027334.html
>         3. Add an abstract class ParHeapInspectTask in heapInspection.hpp / 
> heapInspection.cpp, It's work(uint worker_id) method prepares the data 
> structure (KlassInfoTable) need for every parallel worker thread, and then 
> call do_object_iterate_parallel() which is heap specific implementation. I 
> also added some machenism in KlassInfoTable to support parallel iteration, 
> such as merge().
>        4. In specific heap (G1 in this patch), create a subclass of 
> ParHeapInspectTask, implement the do_object_iterate_parallel() for parallel 
> heap inspection. For G1, it simply invoke g1CollectedHeap's 
> object_iterate_parallel().
>        5. Add related test.
>        6. it may be easy to extend this patch for other kinds of heap by 
> creating subclass of ParHeapInspectTask and implement the 
> do_object_iterate_parallel().
>    
>    Hope these info could help on code review and initate the discussion :-) 
>    Thanks!
>     
>    BRs,
>    Lin
    
>    >On 2020/2/19, 9:40 AM, "linzang(臧琳)" <linz...@tencent.com> wrote:.
>    >
>    >  Re-post this RFR with correct enhancement number to make it trackable.
>    >  please ignore the previous wrong post. sorry for troubles. 
>    >    
>    >   webrev: 
> http://cr.openjdk.java.net/~lzang/jmap-8214535/8215624/webrev_01/
>    >    Hi bug: https://bugs.openjdk.java.net/browse/JDK-8215624
>    >    CSR: https://bugs.openjdk.java.net/browse/JDK-8239290
>    >    --------------
>    >    Lin
>    >    >Hi Lin,
>    >    >
>    >    >Could you, please, re-post your RFR with the right enhancement 
> number in
>    >    >the message subject?
>    >    >It will be more trackable this way.
>    >    >
>    >    >Thanks,
>    >    >Serguei
>    >    >
>    >    >
>    >    >On 2/17/20 10:29 PM, linzang(臧琳) wrote:
>    >    >> Dear David,
>    >    >>        Thanks a lot!
>    >    >>       I have updated the refined code to 
> http://cr.openjdk.java.net/~lzang/jmap-8214535/8215264/webrev_01/.
>    >    >>        IMHO the parallel heap inspection can be extended to all 
> kinds of heap as long as the heap layout can support parallel iteration.
>    >    >>        Maybe we can firstly use this webrev to discuss how to 
> implement it, because I am not sure my current implementation is an 
> appropriate way to communicate with collectedHeap, then we can extend the 
> solution to other kinds of heap.
>    >    >>    
>    >    >> Thanks,
>    >    >> --------------
>    >    >> Lin
>    >    >>> Hi Lin,
>    >    >>>
>    >    >>> Adding in hotspot-gc-dev as they need to see how this interacts 
> with GC
>    >    >>> worker threads, and whether it needs to be extended beyond G1.
>    >    >>>
>    >   >>> I happened to spot one nit when browsing:
>    >    >>>
>    >    >>> src/hotspot/share/gc/shared/collectedHeap.hpp
>    >    >>>
>    >    >>> +   virtual bool run_par_heap_inspect_task(KlassInfoTable* cit,
>    >    >>> +                                          BoolObjectClosure* 
> filter,
>    >    >>> +                                          size_t* missed_count,
>    >    >>> +                                          size_t thread_num) {
>    >    >>> +     return NULL;
>    >    >>>
>    >    >>> s/NULL/false/
>    >    >>>
>    >    >>> Cheers,
>    >    >>> David
>    >    >>>
>    >    >>> On 18/02/2020 2:15 pm, linzang(臧琳) wrote:
>    >    >>>> Dear All,
>    >    >>>>         May I ask your help to review the follow changes:
>    >    >>>>         webrev:
>    >    >>>> http://cr.openjdk.java.net/~lzang/jmap-8214535/8215264/webrev_00/
>    >    >>>>      bug: https://bugs.openjdk.java.net/browse/JDK-8215624
>    >    >>>>      related CSR: 
> https://bugs.openjdk.java.net/browse/JDK-8239290
>    >    >>>>         This patch enable parallel heap inspection of G1 for 
> jmap histo.
>    >    >>>>         my simple test shown it can speed up 2x of jmap -histo 
> with
>    >    >>>> parallelThreadNum set to 2 for heap at ~500M on 4-core platform.
>    >    >>>>
>    >    >>>> 
> ------------------------------------------------------------------------
>    >    >>>> BRs,
>    >    >>>> Lin
>    >    >> >
>    >    >
    
    

Reply via email to