RFR: 8336707: Contention of ForkJoinPool grows when stealing works [v23]

Viktor Klang vklang at openjdk.org
Mon Nov 11 16:20:05 UTC 2024


On Mon, 11 Nov 2024 16:01:08 GMT, Doug Lea <dl at openjdk.org> wrote:

>> This addresses tendencies in previous update to increase fencing, scanning, and signalling that can increase contention, and slow down performance especially on ARM platforms. It also uses more ARM-friendly constructions to reduce overhead (leading to several changes that all of the same form),
>
> Doug Lea has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - Merge remote-tracking branch 'refs/remotes/origin/JDK-8336707' into JDK-8336707
>  - Reconcile internal docs; renamings

src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 417:

> 415:      * * STOP: no more tasks run, and deregister all workers
> 416:      * * CLEANED: all unexecuted tasks have been cancelled
> 417:      * * TERMINATED: all qorkers deregistered and all queues cleaned

Suggestion:

     * * TERMINATED: all workers deregistered and all queues cleaned

src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 663:

> 661:      * * A call to shutdownNow, in which case all workers are
> 662:      *   interrupted.  ensuring that the queues array is stable,
> 663:      *   so will not miss any of them.

Suggestion:

     *   interrupted, and ensuring that the array of queues is stable,
     *   so will not miss any of them.

src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 676:

> 674:      * cancel (benefitting from parallelism) versus contention and
> 675:      * interference when many threads try to poll remaining queues,
> 676:      * while also avoiding unnecessary rechedcks, by using

Suggestion:

     * while also avoiding unnecessary rechecks, by using

src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 688:

> 686:      * before executing task bodies, and ensures interrupts while
> 687:      * terminating. Even so, there are no guarantees because tasks may
> 688:      * internally enter unbounded loops.

Good point to make

src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 874:

> 872:      * cancellation by others, which can occur along several different
> 873:      * paths. The inability to rely on caller-runs may also require
> 874:      * extra signalling (and resulting scanning and contention) so is

Suggestion:

     * extra signalling (resulting in increased scanning and contention) so is

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21507#discussion_r1836899379
PR Review Comment: https://git.openjdk.org/jdk/pull/21507#discussion_r1836903791
PR Review Comment: https://git.openjdk.org/jdk/pull/21507#discussion_r1836908015
PR Review Comment: https://git.openjdk.org/jdk/pull/21507#discussion_r1836908858
PR Review Comment: https://git.openjdk.org/jdk/pull/21507#discussion_r1836910984


More information about the core-libs-dev mailing list