diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2025-07-23 17:35:54 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-08-15 11:31:00 -0700 |
| commit | 13df972f6885ebdeba1ea38f0acd99ea0f2bfb49 (patch) | |
| tree | a21583595b6f0e8a29054840d6b04bba04f5fbe4 /src/runtime/proc.go | |
| parent | bd07fafb0a2f979b2be05d9a533182ca55428079 (diff) | |
| download | go-13df972f6885ebdeba1ea38f0acd99ea0f2bfb49.tar.xz | |
runtime/metrics: add metrics for goroutine sched states
This is largely a port of CL 38180.
For #15490.
Change-Id: I2726111e472e81e9f9f0f294df97872c2689f061
Reviewed-on: https://go-review.googlesource.com/c/go/+/690397
Reviewed-by: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/runtime/proc.go')
| -rw-r--r-- | src/runtime/proc.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 8d5f2fc793..15f10f087e 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1648,6 +1648,7 @@ func stopTheWorldWithSema(reason stwReason) worldStop { if trace.ok() { trace.ProcSteal(pp, false) } + sched.nGsyscallNoP.Add(1) pp.syscalltick++ pp.gcStopTime = nanotime() sched.stopwait-- @@ -2174,6 +2175,7 @@ func forEachPInternal(fn func(*p)) { trace.ProcSteal(p2, false) traceRelease(trace) } + sched.nGsyscallNoP.Add(1) p2.syscalltick++ handoffp(p2) } else if trace.ok() { @@ -2447,6 +2449,7 @@ func needm(signal bool) { // mp.curg is now a real goroutine. casgstatus(mp.curg, _Gdead, _Gsyscall) sched.ngsys.Add(-1) + sched.nGsyscallNoP.Add(1) if !signal { if trace.ok() { @@ -2582,6 +2585,7 @@ func dropm() { casgstatus(mp.curg, _Gsyscall, _Gdead) mp.curg.preemptStop = false sched.ngsys.Add(1) + sched.nGsyscallNoP.Add(-1) if !mp.isExtraInSig { if trace.ok() { @@ -4675,6 +4679,7 @@ func entersyscall_gcwait() { trace.ProcSteal(pp, true) traceRelease(trace) } + sched.nGsyscallNoP.Add(1) pp.gcStopTime = nanotime() pp.syscalltick++ if sched.stopwait--; sched.stopwait == 0 { @@ -4707,6 +4712,8 @@ func entersyscallblock() { gp.m.syscalltick = gp.m.p.ptr().syscalltick gp.m.p.ptr().syscalltick++ + sched.nGsyscallNoP.Add(1) + // Leave SP around for GC and traceback. pc := sys.GetCallerPC() sp := sys.GetCallerSP() @@ -4927,6 +4934,7 @@ func exitsyscallfast_pidle() bool { } unlock(&sched.lock) if pp != nil { + sched.nGsyscallNoP.Add(-1) acquirep(pp) return true } @@ -4953,6 +4961,7 @@ func exitsyscall0(gp *g) { trace.GoSysExit(true) traceRelease(trace) } + sched.nGsyscallNoP.Add(-1) dropg() lock(&sched.lock) var pp *p @@ -5528,8 +5537,11 @@ func badunlockosthread() { throw("runtime: internal error: misuse of lockOSThread/unlockOSThread") } -func gcount() int32 { - n := int32(atomic.Loaduintptr(&allglen)) - sched.gFree.stack.size - sched.gFree.noStack.size - sched.ngsys.Load() +func gcount(includeSys bool) int32 { + n := int32(atomic.Loaduintptr(&allglen)) - sched.gFree.stack.size - sched.gFree.noStack.size + if !includeSys { + n -= sched.ngsys.Load() + } for _, pp := range allp { n -= pp.gFree.size } @@ -6404,6 +6416,7 @@ func retake(now int64) uint32 { trace.ProcSteal(pp, false) traceRelease(trace) } + sched.nGsyscallNoP.Add(1) n++ pp.syscalltick++ handoffp(pp) |
