[dev.regabi] cmd/go: Use GOMAXPROCS to limit default build, compile parallelism

When people want deterministic/single-process builds, they probably
assume that GOMAXPROCS=1 will do that.  It currently does not,
neither for build parallelism nor for compiler internal parallelism.
(Current incantation for that is "go build -p=1 -gcflags=all=-c=1 ... ")

This CL makes
  "GOMAXPROCS=1 go build ..."
behave like
  "go build -p=1 -gcflags=all=-c=1 ... "

RELNOTE=yes

Change-Id: I9cfe50b7deee7334d2f1057b58385f6c98547b9f
Reviewed-on: https://go-review.googlesource.com/c/go/+/284695
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
David Chase 2020-10-14 13:05:33 -04:00
parent 9b636feafe
commit 667e08ba8c
4 changed files with 24 additions and 21 deletions

View file

@ -111,7 +111,7 @@
// -p n // -p n
// the number of programs, such as build commands or // the number of programs, such as build commands or
// test binaries, that can be run in parallel. // test binaries, that can be run in parallel.
// The default is the number of CPUs available. // The default is GOMAXPROCS, normally the number of CPUs available.
// -race // -race
// enable data race detection. // enable data race detection.
// Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64, // Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64,

View file

@ -28,18 +28,18 @@ var (
BuildA bool // -a flag BuildA bool // -a flag
BuildBuildmode string // -buildmode flag BuildBuildmode string // -buildmode flag
BuildContext = defaultContext() BuildContext = defaultContext()
BuildMod string // -mod flag BuildMod string // -mod flag
BuildModExplicit bool // whether -mod was set explicitly BuildModExplicit bool // whether -mod was set explicitly
BuildModReason string // reason -mod was set, if set by default BuildModReason string // reason -mod was set, if set by default
BuildI bool // -i flag BuildI bool // -i flag
BuildLinkshared bool // -linkshared flag BuildLinkshared bool // -linkshared flag
BuildMSan bool // -msan flag BuildMSan bool // -msan flag
BuildN bool // -n flag BuildN bool // -n flag
BuildO string // -o flag BuildO string // -o flag
BuildP = runtime.NumCPU() // -p flag BuildP = runtime.GOMAXPROCS(0) // -p flag
BuildPkgdir string // -pkgdir flag BuildPkgdir string // -pkgdir flag
BuildRace bool // -race flag BuildRace bool // -race flag
BuildToolexec []string // -toolexec flag BuildToolexec []string // -toolexec flag
BuildToolchainName string BuildToolchainName string
BuildToolchainCompiler func() string BuildToolchainCompiler func() string
BuildToolchainLinker func() string BuildToolchainLinker func() string

View file

@ -71,7 +71,7 @@ and test commands:
-p n -p n
the number of programs, such as build commands or the number of programs, such as build commands or
test binaries, that can be run in parallel. test binaries, that can be run in parallel.
The default is the number of CPUs available. The default is GOMAXPROCS, normally the number of CPUs available.
-race -race
enable data race detection. enable data race detection.
Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64, Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64,

View file

@ -239,16 +239,19 @@ CheckFlags:
// - it has no successor packages to compile (usually package main) // - it has no successor packages to compile (usually package main)
// - all paths through the build graph pass through it // - all paths through the build graph pass through it
// - critical path scheduling says it is high priority // - critical path scheduling says it is high priority
// and in such a case, set c to runtime.NumCPU. // and in such a case, set c to runtime.GOMAXPROCS(0).
// By default this is the same as runtime.NumCPU.
// We do this now when p==1. // We do this now when p==1.
// To limit parallelism, set GOMAXPROCS below numCPU; this may be useful
// on a low-memory builder, or if a deterministic build order is required.
c := runtime.GOMAXPROCS(0)
if cfg.BuildP == 1 { if cfg.BuildP == 1 {
// No process parallelism. Max out c. // No process parallelism, do not cap compiler parallelism.
return runtime.NumCPU() return c
} }
// Some process parallelism. Set c to min(4, numcpu). // Some process parallelism. Set c to min(4, maxprocs).
c := 4 if c > 4 {
if ncpu := runtime.NumCPU(); ncpu < c { c = 4
c = ncpu
} }
return c return c
} }