aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/proc.go
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2025-07-23 17:35:54 +0000
committerGopher Robot <gobot@golang.org>2025-08-15 11:31:00 -0700
commit13df972f6885ebdeba1ea38f0acd99ea0f2bfb49 (patch)
treea21583595b6f0e8a29054840d6b04bba04f5fbe4 /src/runtime/proc.go
parentbd07fafb0a2f979b2be05d9a533182ca55428079 (diff)
downloadgo-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.go17
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)