[Bug] Load imbalance of Tasks among GCTaskThreads during the Young GC
Tony S
suokunstar at gmail.com
Sat Nov 19 04:54:08 UTC 2016
Hi,
[Description]
src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
PSPromotionManager enqueues various tasks (ThreadRootsTask / StealTask
/ ScavengeRootsTask / OldToYoungRootsTask) into GCTaskQueue.
GCTaskThread asked GCTaskManager to call get_task() to obtain tasks
from the GCTaskQueue. However, I found the tasks are not distributed
evenly among the GCTaskThreads. Some GCTaskThreads get more tasks than
others. Here are my trace log:
[Tracing Log]
OldToYoungRootsTask GCTaskThread ID:4
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:10
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:10
OldToYoungRootsTask GCTaskThread ID:3
OldToYoungRootsTask GCTaskThread ID:10
OldToYoungRootsTask GCTaskThread ID:4
OldToYoungRootsTask GCTaskThread ID:10
ScavengeRootsTask GCTaskThread ID:4
ScavengeRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:10
OldToYoungRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ThreadRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:3
ScavengeRootsTask GCTaskThread ID:3
ScavengeRootsTask GCTaskThread ID:3
ScavengeRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:10
ScavengeRootsTask GCTaskThread ID:3
ScavengeRootsTask GCTaskThread ID:3
ScavengeRootsTask GCTaskThread ID:3
ThreadRootsTask GCTaskThread ID:4
ScavengeRootsTask GCTaskThread ID:10
StealTask GCTaskThread ID:6
StealTask GCTaskThread ID:9
StealTask GCTaskThread ID:3
StealTask GCTaskThread ID:14
StealTask GCTaskThread ID:7
StealTask GCTaskThread ID:5
StealTask GCTaskThread ID:8
StealTask GCTaskThread ID:0
StealTask GCTaskThread ID:12
StealTask GCTaskThread ID:13
StealTask GCTaskThread ID:2
StealTask GCTaskThread ID:4
StealTask GCTaskThread ID:11
StealTask GCTaskThread ID:1
StealTask GCTaskThread ID:10
I use dacapo benchmark, running lusearch on JDK 1.8 on ubuntu 16.10. I
have totally 15 GCTaskThreads on the above test. We can see that only
StealTasks are evenly executed on different GCTaskThread. The other
tasks are executed on
few GCTaskThreads, not evenly distributed.
When I increase the number of mutator threads and thus have more tasks
(ThreadRootsTask / StealTask / ScavengeRootsTask /
OldToYoungRootsTask), however, those tasks are still not distributed
evenly among the GCTaskThreads, which causes the load imbalance and
thus prolongs the Young GC time.
Did anyone know the reason?
Thanks.
--
**********************************
> Tony
> Computer Science, University of Texas at Arlington
**********************************
More information about the hotspot-gc-dev
mailing list