]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.9] runtime: fix gctrace STW CPU time and CPU fraction
authorAustin Clements <austin@google.com>
Tue, 14 Nov 2017 23:08:32 +0000 (15:08 -0800)
committerAndrew Bonventre <andybons@golang.org>
Mon, 22 Jan 2018 20:25:02 +0000 (20:25 +0000)
The CPU time reported in the gctrace for STW phases is simply
work.stwprocs times the wall-clock duration of these phases. However,
work.stwprocs is set to gcprocs(), which is wrong for multiple
reasons:

1. gcprocs is intended to limit the number of Ms used for mark
   termination based on how well the garbage collector actually
   scales, but the gctrace wants to report how much CPU time is being
   stolen from the application. During STW, that's *all* of the CPU,
   regardless of how many the garbage collector can actually use.

2. gcprocs assumes it's being called during STW, so it limits its
   result to sched.nmidle+1. However, we're not calling it during STW,
   so sched.nmidle is typically quite small, even if GOMAXPROCS is
   quite large.

Fix this by setting work.stwprocs to min(ncpu, GOMAXPROCS). This also
fixes the overall GC CPU fraction, which is based on the computed CPU
times.

Fixes #22725.

Change-Id: I64b5ce87e28dbec6870aa068ce7aecdd28c058d1
Reviewed-on: https://go-review.googlesource.com/77710
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
Reviewed-on: https://go-review.googlesource.com/88321
Run-TryBot: Andrew Bonventre <andybons@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/mgc.go

index b708720322b3fff4ed025131007508b8ef247dde..e6909918f28253a8fcafb7e8b390824438ccbb51 100644 (file)
@@ -1251,7 +1251,12 @@ func gcStart(mode gcMode, trigger gcTrigger) {
 
        gcResetMarkState()
 
-       work.stwprocs, work.maxprocs = gcprocs(), gomaxprocs
+       work.stwprocs, work.maxprocs = gomaxprocs, gomaxprocs
+       if work.stwprocs > ncpu {
+               // This is used to compute CPU time of the STW phases,
+               // so it can't be more than ncpu, even if GOMAXPROCS is.
+               work.stwprocs = ncpu
+       }
        work.heap0 = atomic.Load64(&memstats.heap_live)
        work.pauseNS = 0
        work.mode = mode