From 41dfb472eec6d85b99ec7fe09ef754a9c0bfe9bb Mon Sep 17 00:00:00 2001 From: Rob Holland Date: Tue, 9 May 2023 10:59:37 +0100 Subject: [PATCH 1/2] Add automaxprocs. This will automate the setting of GOMAXPROCS in Kubernetes/docker environments where it is not already set as part of the deployment. Setting GOMAXPROCS to match resource limits (rather than the total core count of the node) allows Go to more efficiently use the available cores and reduces CPU throttling (eliminating it if limits are set to an integer number of cores). This issue was highlighted during benchmarking but probably effects a large number of real world Kubernetes deployments where CPU limits are set but GOMAXPROCS is not. --- cmd/server/main.go | 1 + go.mod | 1 + go.sum | 3 +++ 3 files changed, 5 insertions(+) diff --git a/cmd/server/main.go b/cmd/server/main.go index e8d8154ed2c..f137782880d 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -33,6 +33,7 @@ import ( _ "time/tzdata" // embed tzdata as a fallback "github.com/urfave/cli/v2" + _ "go.uber.org/automaxprocs" "go.temporal.io/server/common/authorization" "go.temporal.io/server/common/build" diff --git a/go.mod b/go.mod index 9082dfad300..63f4acb9d9b 100644 --- a/go.mod +++ b/go.mod @@ -48,6 +48,7 @@ require ( go.temporal.io/sdk v1.22.1 go.temporal.io/version v0.3.0 go.uber.org/atomic v1.10.0 + go.uber.org/automaxprocs v1.5.2 go.uber.org/fx v1.19.1 go.uber.org/multierr v1.9.0 go.uber.org/zap v1.24.0 diff --git a/go.sum b/go.sum index eb9d2e3de0b..623476980be 100644 --- a/go.sum +++ b/go.sum @@ -970,6 +970,7 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/protectmem v0.0.0-20171002184600-e20412882b3a h1:AA9vgIBDjMHPC2McaGPojgV2dcI78ZC0TLNhYCXEKH8= github.com/prashantv/protectmem v0.0.0-20171002184600-e20412882b3a/go.mod h1:lzZQ3Noex5pfAy7mkAeCjcBDteYU85uWWnJ/y6gKU8k= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1129,6 +1130,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/dig v1.16.1 h1:+alNIBsl0qfY0j6epRubp/9obgtrObRAc5aD+6jbWY8= go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= go.uber.org/fx v1.19.1 h1:JwYIYAQzXBuBBwSZ1/tn/95pnQO/Sp3yE8lWj9eSAzI= From 7cdd5594e19efabd0ce43982af15dd76e11ed398 Mon Sep 17 00:00:00 2001 From: Rob Holland Date: Tue, 9 May 2023 11:54:43 +0100 Subject: [PATCH 2/2] Use different API to avoid automated log message. --- cmd/server/main.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index f137782880d..fee18397895 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -33,7 +33,7 @@ import ( _ "time/tzdata" // embed tzdata as a fallback "github.com/urfave/cli/v2" - _ "go.uber.org/automaxprocs" + "go.uber.org/automaxprocs/maxprocs" "go.temporal.io/server/common/authorization" "go.temporal.io/server/common/build" @@ -120,6 +120,10 @@ func buildCLI() *cli.App { if c.Args().Len() > 0 { return cli.Exit("ERROR: start command doesn't support arguments. Use --service flag instead.", 1) } + + if _, err := maxprocs.Set(); err != nil { + stdlog.Println(fmt.Sprintf("WARNING: failed to set GOMAXPROCS: %v.", err)) + } return nil }, Action: func(c *cli.Context) error {