This CL adds two related features enabled by default via compatibility GODEBUGs containermaxprocs and updatemaxprocs. On Linux, containermaxprocs makes the Go runtime consider cgroup CPU bandwidth limits (quota/period) when setting GOMAXPROCS. If the cgroup limit is lower than the number of logical CPUs available, then the cgroup limit takes precedence. On all OSes, updatemaxprocs makes the Go runtime periodically recalculate the default GOMAXPROCS value and update GOMAXPROCS if it has changed. If GOMAXPROCS is set manually, this update does not occur. This is intended primarily to detect changes to cgroup limits, but it applies on all OSes because the CPU affinity mask can change as well. The runtime only considers the limit in the leaf cgroup (the one that actually contains the process), caching the CPU limit file descriptor(s), which are periodically reread for updates. This is a small departure from the original proposed design. It will not consider limits of parent cgroups (which may be lower than the leaf), and it will not detection cgroup migration after process start. We can consider changing this in the future, but the simpler approach is less invasive; less risk to packages that have some awareness of runtime internals. e.g., if the runtime periodically opens new files during execution, file descriptor leak detection is difficult to implement in a stable way. For #73193. Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest Change-Id: I6a6a636c631c1ae577fb8254960377ba91c5dc98 Reviewed-on: https://go-review.googlesource.com/c/go/+/670497 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Knyszek <mknyszek@google.com>
2.6 KiB
Runtime
The message printed when a program exits due to an unhandled panic that was recovered and repanicked no longer repeats the text of the panic value.
Previously, a program which panicked with panic("PANIC"),
recovered the panic, and then repanicked with the original
value would print:
panic: PANIC [recovered]
panic: PANIC
This program will now print:
panic: PANIC [recovered, repanicked]
The default behavior of the GOMAXPROCS has changed. In prior versions of Go,
GOMAXPROCS defaults to the number of logical CPUs available at startup
([runtime.NumCPU]). Go 1.25 introduces two changes:
-
On Linux, the runtime considers the CPU bandwidth limit of the cgroup containing the process, if any. If the CPU bandwidth limit is lower than the number of logical CPUs available,
GOMAXPROCSwill default to the lower limit. In container runtime systems like Kubernetes, cgroup CPU bandwidth limits generally correspond to the "CPU limit" option. The Go runtime does not consider the "CPU requests" option. -
On all OSes, the runtime periodically updates
GOMAXPROCSif the number of logical CPUs available or the cgroup CPU bandwidth limit change.
Both of these behaviors are automatically disabled if GOMAXPROCS is set
manually via the GOMAXPROCS environment variable or a call to
[runtime.GOMAXPROCS]. They can also be disabled explicitly with the GODEBUG
settings containermaxprocs=0 and updatemaxprocs=0,
respectively.
In order to support reading updated cgroup limits, the runtime will keep cached file descriptors for the cgroup files for the duration of the process lifetime.
On Linux systems with kernel support for anonymous VMA names
(CONFIG_ANON_VMA_NAME), the Go runtime will annotate anonymous memory
mappings with context about their purpose. e.g., [anon: Go: heap] for heap
memory. This can be disabled with the GODEBUG setting
decoratemappings=0.
A new experimental garbage collector is now available as an experiment. The new design aims to improve the efficiency of garbage collection through better locality and CPU scalability in the mark algorithm. Benchmark result vary, but we expect somewhere between a 10—40% reduction in garbage collection overhead in real-world programs that heavily use the garbage collector.
The new garbage collector may be enabled by setting GOEXPERIMENT=greenteagc
at build time. See the GitHub issue for more details on the design
and instructions on how to report feedback.