go/api/next
Michael Pratt e6dacf91ff 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-21 10:21:55 -07:00
..
46771.txt mime/multipart: add helper to build content-disposition header contents 2025-03-12 16:20:01 -07:00
49580.txt io/fs: add ReadLinkFS interface 2025-02-03 08:38:43 -08:00
59928.txt testing: add Output 2025-05-13 15:43:42 -07:00
62121.txt reflect: add TypeAssert[T] 2025-05-20 12:40:33 -07:00
63405.txt crypto,crypto/x509: implement MessageSigner 2025-05-08 07:46:12 -07:00
63796.txt sync: add WaitGroup.Go 2025-04-04 08:19:32 -07:00
67002.txt os: add Root.MkdirAll 2025-05-21 10:14:43 -07:00
67434.txt testing/synctest: add Test 2025-05-20 15:46:03 -07:00
67516.txt crypto/tls: add ConnectionState.CurveID 2025-03-13 08:19:32 -07:00
70250.txt api: move go1.25 to next/70250 2025-04-03 08:07:11 -07:00
70280.txt log/slog: export Source method in Record for custom handler support 2025-05-06 03:58:07 -07:00
70780.txt unicode: add CategoryAliases, Cn, LC 2025-04-18 14:13:31 -07:00
71122.txt go/parser: deprecate parser.ParseDir 2025-02-19 11:49:13 -08:00
72843.txt debug/elf: add riscv attributes definitions 2025-03-14 15:08:23 -07:00
73193.txt runtime: use cgroup CPU limit to set GOMAXPROCS 2025-05-21 10:21:55 -07:00
73205.txt go/token: add FileSet.AddExistingFiles 2025-05-19 11:26:48 -07:00
73319.txt go/ast: add PreorderStack, a variant of Inspect that builds a stack 2025-05-19 10:54:45 -07:00