1
0
mirror of https://github.com/golang/go synced 2024-11-15 06:50:32 -07:00

runtime: factor out GC pause time CPU stats update

Currently this is done manually in two places. Replace these manual
updates with a method that also forces the caller to be mindful that the
number will be multiplied (and that it needs to be). This will make
follow-up changes simpler too.

Change-Id: I81ea844b47a40ff3470d23214b4b2fb5b71a4abe
Reviewed-on: https://go-review.googlesource.com/c/go/+/570255
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Michael Anthony Knyszek 2024-03-08 22:59:46 +00:00 committed by Gopher Robot
parent ddc6e165fd
commit 08a7ab97ba
2 changed files with 14 additions and 8 deletions

View File

@ -747,9 +747,8 @@ func gcStart(trigger gcTrigger) {
work.pauseNS += now - stw.start work.pauseNS += now - stw.start
work.tMark = now work.tMark = now
sweepTermCpu := int64(work.stwprocs) * (work.tMark - work.tSweepTerm) // Update the CPU stats pause time.
work.cpuStats.gcPauseTime += sweepTermCpu work.cpuStats.accumulateGCPauseTime(now-work.tSweepTerm, work.stwprocs)
work.cpuStats.gcTotalTime += sweepTermCpu
// Release the CPU limiter. // Release the CPU limiter.
gcCPULimiter.finishGCTransition(now) gcCPULimiter.finishGCTransition(now)
@ -1017,13 +1016,10 @@ func gcMarkTermination(stw worldStop) {
memstats.pause_end[memstats.numgc%uint32(len(memstats.pause_end))] = uint64(unixNow) memstats.pause_end[memstats.numgc%uint32(len(memstats.pause_end))] = uint64(unixNow)
memstats.pause_total_ns += uint64(work.pauseNS) memstats.pause_total_ns += uint64(work.pauseNS)
markTermCpu := int64(work.stwprocs) * (work.tEnd - work.tMarkTerm)
work.cpuStats.gcPauseTime += markTermCpu
work.cpuStats.gcTotalTime += markTermCpu
// Accumulate CPU stats. // Accumulate CPU stats.
// //
// Pass gcMarkPhase=true so we can get all the latest GC CPU stats in there too. // Pass gcMarkPhase=true so we can get all the latest GC CPU stats in there too.
work.cpuStats.accumulateGCPauseTime(work.tEnd-work.tMarkTerm, work.stwprocs)
work.cpuStats.accumulate(now, true) work.cpuStats.accumulate(now, true)
// Compute overall GC CPU utilization. // Compute overall GC CPU utilization.
@ -1166,7 +1162,7 @@ func gcMarkTermination(stw worldStop) {
gcController.assistTime.Load(), gcController.assistTime.Load(),
gcController.dedicatedMarkTime.Load() + gcController.fractionalMarkTime.Load(), gcController.dedicatedMarkTime.Load() + gcController.fractionalMarkTime.Load(),
gcController.idleMarkTime.Load(), gcController.idleMarkTime.Load(),
markTermCpu, int64(work.stwprocs) * (work.tEnd - work.tMarkTerm),
} { } {
if i == 2 || i == 3 { if i == 2 || i == 3 {
// Separate mark time components with /. // Separate mark time components with /.

View File

@ -921,6 +921,16 @@ type cpuStats struct {
totalTime int64 // GOMAXPROCS * (monotonic wall clock time elapsed) totalTime int64 // GOMAXPROCS * (monotonic wall clock time elapsed)
} }
// accumulateGCPauseTime add dt*stwProcs to the GC CPU pause time stats. dt should be
// the actual time spent paused, for orthogonality. stwProcs should be GOMAXPROCS,
// not work.stwprocs, since this number must be comparable to a total time computed
// from GOMAXPROCS.
func (s *cpuStats) accumulateGCPauseTime(dt int64, stwProcs int32) {
cpu := dt * int64(stwProcs)
s.gcPauseTime += cpu
s.gcTotalTime += cpu
}
// accumulate takes a cpuStats and adds in the current state of all GC CPU // accumulate takes a cpuStats and adds in the current state of all GC CPU
// counters. // counters.
// //