aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/debug.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/debug.go')
-rw-r--r--src/runtime/debug.go68
1 files changed, 65 insertions, 3 deletions
diff --git a/src/runtime/debug.go b/src/runtime/debug.go
index 57e9ba8d7d..94d1dab34d 100644
--- a/src/runtime/debug.go
+++ b/src/runtime/debug.go
@@ -10,9 +10,28 @@ import (
)
// GOMAXPROCS sets the maximum number of CPUs that can be executing
-// simultaneously and returns the previous setting. It defaults to
-// the value of [runtime.NumCPU]. If n < 1, it does not change the current setting.
-// This call will go away when the scheduler improves.
+// simultaneously and returns the previous setting. If n < 1, it does not change
+// the current setting.
+//
+// If the GOMAXPROCS environment variable is set to a positive whole number,
+// GOMAXPROCS defaults to that value.
+//
+// Otherwise, the Go runtime selects an appropriate default value based on the
+// number of logical CPUs on the machine, the process’s CPU affinity mask, and,
+// on Linux, the process’s average CPU throughput limit based on cgroup CPU
+// quota, if any.
+//
+// The Go runtime periodically updates the default value based on changes to
+// the total logical CPU count, the CPU affinity mask, or cgroup quota. Setting
+// a custom value with the GOMAXPROCS environment variable or by calling
+// GOMAXPROCS disables automatic updates. The default value and automatic
+// updates can be restored by calling [SetDefaultGOMAXPROCS].
+//
+// If GODEBUG=containermaxprocs=0 is set, GOMAXPROCS defaults to the value of
+// [runtime.NumCPU]. If GODEBUG=updatemaxprocs=0 is set, the Go runtime does
+// not perform automatic GOMAXPROCS updating.
+//
+// The default GOMAXPROCS behavior may change as the scheduler improves.
func GOMAXPROCS(n int) int {
if GOARCH == "wasm" && n > 1 {
n = 1 // WebAssembly has no threads yet, so only one CPU is possible.
@@ -28,12 +47,55 @@ func GOMAXPROCS(n int) int {
stw := stopTheWorldGC(stwGOMAXPROCS)
// newprocs will be processed by startTheWorld
+ //
+ // TODO(prattmic): this could use a nicer API. Perhaps add it to the
+ // stw parameter?
newprocs = int32(n)
+ newprocsCustom = true
startTheWorldGC(stw)
return ret
}
+// SetDefaultGOMAXPROCS updates the GOMAXPROCS setting to the runtime
+// default, as described by [GOMAXPROCS], ignoring the GOMAXPROCS
+// environment variable.
+//
+// SetDefaultGOMAXPROCS can be used to enable the default automatic updating
+// GOMAXPROCS behavior if it has been disabled by the GOMAXPROCS
+// environment variable or a prior call to [GOMAXPROCS], or to force an immediate
+// update if the caller is aware of a change to the total logical CPU count, CPU
+// affinity mask or cgroup quota.
+func SetDefaultGOMAXPROCS() {
+ // SetDefaultGOMAXPROCS conceptually means "[re]do what the runtime
+ // would do at startup if the GOMAXPROCS environment variable were
+ // unset." It still respects GODEBUG.
+
+ procs := defaultGOMAXPROCS(0)
+
+ lock(&sched.lock)
+ curr := gomaxprocs
+ custom := sched.customGOMAXPROCS
+ unlock(&sched.lock)
+
+ if !custom && procs == curr {
+ // Nothing to do if we're already using automatic GOMAXPROCS
+ // and the limit is unchanged.
+ return
+ }
+
+ stw := stopTheWorldGC(stwGOMAXPROCS)
+
+ // newprocs will be processed by startTheWorld
+ //
+ // TODO(prattmic): this could use a nicer API. Perhaps add it to the
+ // stw parameter?
+ newprocs = procs
+ newprocsCustom = false
+
+ startTheWorldGC(stw)
+}
+
// NumCPU returns the number of logical CPUs usable by the current process.
//
// The set of available CPUs is checked by querying the operating system