mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: schedule fractional workers on all Ps
Currently only a single P can run a fractional mark worker at a time. This doesn't let us spread out the load, so it gets concentrated on whatever unlucky P picks up the token to run a fractional worker. This can significantly delay goroutines on that P. This commit changes this scheduling rule so each P separately schedules fractional workers. This can significantly reduce the load on any individual P and allows workers to self-preempt earlier. It does have the downside that it's possible for all Ps to be in fractional workers simultaneously (an effect STW). Updates #21698. Change-Id: Ia1e300c422043fa62bb4e3dd23c6232d81e4419c Reviewed-on: https://go-review.googlesource.com/68574 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
parent
28e1a8e47a
commit
e09dbaa1de
2 changed files with 30 additions and 49 deletions
|
|
@ -522,9 +522,10 @@ type p struct {
|
|||
palloc persistentAlloc // per-P to avoid mutex
|
||||
|
||||
// Per-P GC state
|
||||
gcAssistTime int64 // Nanoseconds in assistAlloc
|
||||
gcBgMarkWorker guintptr
|
||||
gcMarkWorkerMode gcMarkWorkerMode
|
||||
gcAssistTime int64 // Nanoseconds in assistAlloc
|
||||
gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker
|
||||
gcBgMarkWorker guintptr
|
||||
gcMarkWorkerMode gcMarkWorkerMode
|
||||
|
||||
// gcMarkWorkerStartTime is the nanotime() at which this mark
|
||||
// worker started.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue