From: Bryan C. Mills Date: Wed, 26 Jan 2022 17:45:12 +0000 (-0500) Subject: cmd/api: reduce parallel 'go list' invocations to a constant X-Git-Tag: go1.18beta2~24 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=946a8669d92f18a0029abaed9cea36194562a957;p=gostls13.git cmd/api: reduce parallel 'go list' invocations to a constant 'go list' has its own internal parallelism, so invoking in in parallel can produce up to quadratic peak memory usage. Running 'go list' is also very I/O-intensive, so the higher parallelism does substantially improve latency; unfortunately, we lack a good way to balance latency against memory footprint, so we need to sacrifice some latency for reliability. Fixes #49957. Change-Id: Ib53990b46acf4cc67a9141644d97282964d6442d Reviewed-on: https://go-review.googlesource.com/c/go/+/380994 Trust: Bryan Mills Run-TryBot: Bryan Mills TryBot-Result: Gopher Robot Reviewed-by: Dmitri Shuralyov --- diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 036aefe4d8..5ae059e4ce 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -459,8 +459,11 @@ type listImports struct { var listCache sync.Map // map[string]listImports, keyed by contextName -// listSem is a semaphore restricting concurrent invocations of 'go list'. -var listSem = make(chan semToken, ((runtime.GOMAXPROCS(0)-1)/2)+1) +// listSem is a semaphore restricting concurrent invocations of 'go list'. 'go +// list' has its own internal concurrency, so we use a hard-coded constant (to +// allow the I/O-intensive phases of 'go list' to overlap) instead of scaling +// all the way up to GOMAXPROCS. +var listSem = make(chan semToken, 2) type semToken struct{}