2025-02-03 10:25:05 -05:00
|
|
|
## Runtime {#runtime}
|
2025-01-31 15:03:15 -08:00
|
|
|
|
|
|
|
|
<!-- go.dev/issue/71517 -->
|
|
|
|
|
|
|
|
|
|
The message printed when a program exits due to an unhandled panic
|
2025-05-05 12:33:46 -04:00
|
|
|
that was recovered and repanicked no longer repeats the text of
|
2025-01-31 15:03:15 -08:00
|
|
|
the panic value.
|
|
|
|
|
|
|
|
|
|
Previously, a program which panicked with `panic("PANIC")`,
|
2025-05-05 12:33:46 -04:00
|
|
|
recovered the panic, and then repanicked with the original
|
2025-01-31 15:03:15 -08:00
|
|
|
value would print:
|
|
|
|
|
|
|
|
|
|
panic: PANIC [recovered]
|
|
|
|
|
panic: PANIC
|
|
|
|
|
|
|
|
|
|
This program will now print:
|
|
|
|
|
|
2025-05-05 12:33:46 -04:00
|
|
|
panic: PANIC [recovered, repanicked]
|
2025-03-07 13:53:34 -05:00
|
|
|
|
runtime: use cgroup CPU limit to set GOMAXPROCS
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>
2025-05-05 13:44:26 -04:00
|
|
|
<!-- go.dev/issue/73193 -->
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
1. 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, `GOMAXPROCS` will 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.
|
|
|
|
|
|
|
|
|
|
2. On all OSes, the runtime periodically updates `GOMAXPROCS` if 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](/doc/godebug) `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.
|
|
|
|
|
|
2025-03-07 13:53:34 -05:00
|
|
|
<!-- go.dev/issue/71546 -->
|
|
|
|
|
|
|
|
|
|
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](/doc/godebug)
|
|
|
|
|
`decoratemappings=0`.
|
2025-05-09 19:54:01 +00:00
|
|
|
|
|
|
|
|
<!-- go.dev/issue/73581 -->
|
|
|
|
|
|
|
|
|
|
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](/issue/73581) for more details on the design
|
|
|
|
|
and instructions on how to report feedback.
|