From 3b77085b40bf0d53528d6852d07c00c81021c855 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Wed, 28 May 2025 14:34:52 -0400 Subject: [PATCH] runtime: increment updatemaxprocs metric only when disabled The updatemaxprocs metric logic is currently backwards. We only increment the metric when we update GOMAXPROCS, but that only occurs if updatemaxprocs is enabled. Instead, the metric is supposed to increment when updatemaxprocs is disabled and there would be different behavior if it were enabled. Theoretically we should run the entire update system in a dry run mode, and only bail out right before committing updates. But that is an awful lot of effort for a feature that is disabled. Plus some users (like sandboxes) want to completely disable the update syscalls (sched_getaffinity and pread64). If we still do dry run updates then we need an additional GODEBUG for completely disabling functionality. This CL also avoids starting the update goroutine at all if disabled, since it isn't needed. For #73193. Change-Id: I6a6a636ceec8fced44e36cb27dcb1b4ba51fce33 Reviewed-on: https://go-review.googlesource.com/c/go/+/677036 Reviewed-by: Michael Knyszek LUCI-TryBot-Result: Go LUCI Auto-Submit: Michael Pratt --- src/runtime/proc.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index fe9f07723c..4ccce90e93 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -6567,6 +6567,22 @@ var ( // // This is based on forcegchelper. func defaultGOMAXPROCSUpdateEnable() { + if debug.updatemaxprocs == 0 { + // Unconditionally increment the metric when updates are disabled. + // + // It would be more descriptive if we did a dry run of the + // complete update, determining the appropriate value of + // GOMAXPROCS and the bailing out and just incrementing the + // metric if a change would occur. + // + // Not only is that a lot of ongoing work for a disabled + // feature, but some users need to be able to completely + // disable the update system calls (such as sandboxes). + // Currently, updatemaxprocs=0 serves that purpose. + updatemaxprocs.IncNonDefault() + return + } + go updateMaxProcsGoroutine() } @@ -6601,9 +6617,6 @@ func updateMaxProcsGoroutine() { newprocsCustom = false startTheWorldGC(stw) - - // We actually changed something. - updatemaxprocs.IncNonDefault() } }