runtime: remove GODEBUG=runtimecontentionstacks

Go 1.22 promised to remove the setting in a future release once the
semantics of runtime-internal lock contention matched that of
sync.Mutex. That work is done, remove the setting.

Previously reviewed as https://go.dev/cl/585639.

For #66999

Change-Id: I9fe62558ba0ac12824874a0bb1b41efeb7c0853f
Reviewed-on: https://go-review.googlesource.com/c/go/+/668995
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Rhys Hiltner <rhys.hiltner@gmail.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
This commit is contained in:
Rhys Hiltner 2025-04-29 14:39:11 -07:00 committed by Gopher Robot
parent 591c4b50c0
commit 94c4cdc948
7 changed files with 13 additions and 38 deletions

View File

@ -169,6 +169,9 @@ Go command will follow symlinks to regular files embedding files.
The default value `embedfollowsymlinks=0` does not allow following
symlinks. `embedfollowsymlinks=1` will allow following symlinks.
Go 1.25 corrected the semantics of contention reports for runtime-internal locks,
and so removed the [`runtimecontentionstacks` setting](/pkg/runtime#hdr-Environment_Variable).
### Go 1.24
Go 1.24 added a new `fips140` setting that controls whether the Go

View File

@ -0,0 +1,6 @@
The mutex profile for contention on runtime-internal locks now correctly points
to the end of the critical section that caused the delay. This matches the
profile's behavior for contention on `sync.Mutex` values. The
`runtimecontentionstacks` setting for `GODEBUG`, which allowed opting in to the
unusual behavior of Go 1.22 through 1.24 for this part of the profile, is now
gone.

View File

@ -166,15 +166,6 @@ It is a comma-separated list of name=val pairs setting these named variables:
panicnil: setting panicnil=1 disables the runtime error when calling panic with nil
interface value or an untyped nil.
runtimecontentionstacks: setting runtimecontentionstacks=1 enables inclusion of call stacks
related to contention on runtime-internal locks in the "mutex" profile, subject to the
MutexProfileFraction setting. When runtimecontentionstacks=0, contention on
runtime-internal locks will report as "runtime._LostContendedRuntimeLock". When
runtimecontentionstacks=1, the call stacks will correspond to the unlock call that released
the lock. But instead of the value corresponding to the amount of contention that call
stack caused, it corresponds to the amount of time the caller of unlock had to wait in its
original call to lock. A future release is expected to align those and remove this setting.
invalidptr: invalidptr=1 (the default) causes the garbage collector and stack
copier to crash the program if an invalid pointer value (for example, 1)
is found in a pointer-typed location. Setting invalidptr=0 disables this check.

View File

@ -6,7 +6,6 @@ package runtime_test
import (
"bytes"
"fmt"
"internal/abi"
"internal/goexperiment"
"internal/profile"
@ -955,17 +954,6 @@ func TestRuntimeLockMetricsAndProfile(t *testing.T) {
t.Fatalf("need MutexProfileRate 0, got %d", old)
}
{
before := os.Getenv("GODEBUG")
for _, s := range strings.Split(before, ",") {
if strings.HasPrefix(s, "runtimecontentionstacks=") {
t.Logf("GODEBUG includes explicit setting %q", s)
}
}
defer func() { os.Setenv("GODEBUG", before) }()
os.Setenv("GODEBUG", fmt.Sprintf("%s,runtimecontentionstacks=1", before))
}
t.Logf("NumCPU %d", runtime.NumCPU())
t.Logf("GOMAXPROCS %d", runtime.GOMAXPROCS(0))
if minCPU := 2; runtime.NumCPU() < minCPU {
@ -1229,9 +1217,9 @@ func TestRuntimeLockMetricsAndProfile(t *testing.T) {
stks[i] = []string{
"runtime.unlock",
"runtime_test." + name + ".func5.1.1",
"runtime_test." + name + ".func4.1.1",
marker,
"runtime_test." + name + ".func5.1",
"runtime_test." + name + ".func4.1",
"runtime_test.(*contentionWorker).run",
}
}
@ -1411,14 +1399,14 @@ func TestRuntimeLockMetricsAndProfile(t *testing.T) {
{
"runtime.unlock",
"runtime.semrelease1",
"runtime_test.TestRuntimeLockMetricsAndProfile.func6.1",
"runtime_test.TestRuntimeLockMetricsAndProfile.func5.1",
"runtime_test.(*contentionWorker).run",
},
{
"runtime.unlock",
"runtime.semacquire1",
"runtime.semacquire",
"runtime_test.TestRuntimeLockMetricsAndProfile.func6.1",
"runtime_test.TestRuntimeLockMetricsAndProfile.func5.1",
"runtime_test.(*contentionWorker).run",
},
}

View File

@ -732,11 +732,6 @@ func (prof *mLockProfile) captureStack() {
prof.haveStack = true
prof.stack[0] = logicalStackSentinel
if debug.runtimeContentionStacks.Load() == 0 {
prof.stack[1] = abi.FuncPCABIInternal(_LostContendedRuntimeLock) + sys.PCQuantum
prof.stack[2] = 0
return
}
var nstk int
gp := getg()

View File

@ -169,12 +169,6 @@ import (
// holds a lock for 1s while 5 other goroutines are waiting for the entire
// second to acquire the lock, its unlock call stack will report 5s of
// contention.
//
// Runtime-internal locks are always reported at the location
// "runtime._LostContendedRuntimeLock". More detailed stack traces for
// runtime-internal locks can be obtained by setting
// `GODEBUG=runtimecontentionstacks=1` (see package [runtime] docs for
// caveats).
type Profile struct {
name string
mu sync.Mutex

View File

@ -320,7 +320,6 @@ var debug struct {
gctrace int32
invalidptr int32
madvdontneed int32 // for Linux; issue 28466
runtimeContentionStacks atomic.Int32
scavtrace int32
scheddetail int32
schedtrace int32
@ -385,7 +384,6 @@ var dbgvars = []*dbgVar{
{name: "madvdontneed", value: &debug.madvdontneed},
{name: "panicnil", atomic: &debug.panicnil},
{name: "profstackdepth", value: &debug.profstackdepth, def: 128},
{name: "runtimecontentionstacks", atomic: &debug.runtimeContentionStacks},
{name: "sbrk", value: &debug.sbrk},
{name: "scavtrace", value: &debug.scavtrace},
{name: "scheddetail", value: &debug.scheddetail},