diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2022-08-31 21:34:23 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-09-16 16:33:08 +0000 |
| commit | 63ceff95fa7cc93dd848b503dedcef53b918cdc3 (patch) | |
| tree | d323134cf6afd8ad52dece84728c0916d7ae894c /src/runtime/runtime2.go | |
| parent | 686b38b5b27fe14318adfee57aac780c452fddd6 (diff) | |
| download | go-63ceff95fa7cc93dd848b503dedcef53b918cdc3.tar.xz | |
runtime/metrics: add /sync/mutex/wait/total:seconds metric
This change adds a metric to the runtime/metrics package which tracks
total mutex wait time for sync.Mutex and sync.RWMutex. The purpose of
this metric is to be able to quickly get an idea of the total mutex wait
time.
The implementation of this metric piggybacks off of the existing G
runnable tracking infrastructure, as well as the wait reason set on a G
when it goes into _Gwaiting.
Fixes #49881.
Change-Id: I4691abf64ac3574bec69b4d7d4428b1573130517
Reviewed-on: https://go-review.googlesource.com/c/go/+/427618
Reviewed-by: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/runtime/runtime2.go')
| -rw-r--r-- | src/runtime/runtime2.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 1d36126a03..284f9d395d 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -468,7 +468,7 @@ type g struct { sysblocktraced bool // StartTrace has emitted EvGoInSyscall about this goroutine tracking bool // whether we're tracking this G for sched latency statistics trackingSeq uint8 // used to decide whether to track this G - runnableStamp int64 // timestamp of when the G last became runnable, only used when tracking + trackingStamp int64 // timestamp of when the G last started being tracked runnableTime int64 // the amount of time spent runnable, cleared when running, only used when tracking sysexitticks int64 // cputicks when syscall has returned (for tracing) traceseq uint64 // trace event sequencer @@ -843,6 +843,10 @@ type schedt struct { // // Reset on each GC cycle. idleTime atomic.Int64 + + // totalMutexWaitTime is the sum of time goroutines have spent in _Gwaiting + // with a waitreason of the form waitReasonSync{RW,}Mutex{R,}Lock. + totalMutexWaitTime atomic.Int64 } // Values for the flags field of a sigTabT. @@ -1109,6 +1113,12 @@ func (w waitReason) String() string { return waitReasonStrings[w] } +func (w waitReason) isMutexWait() bool { + return w == waitReasonSyncMutexLock || + w == waitReasonSyncRWMutexRLock || + w == waitReasonSyncRWMutexLock +} + var ( allm *m gomaxprocs int32 |
