From 272367ccd2e7792a38b4d414ebe486de0dcf5419 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Thu, 4 Apr 2024 20:06:57 +0800 Subject: [PATCH] feat: add memlimit flags for setMaxResources (#19400) --- cmd/server-main.go | 8 +++++++- cmd/server-rlimit.go | 25 ++++++++++++++++++++++++- cmd/test-utils_test.go | 2 +- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/cmd/server-main.go b/cmd/server-main.go index 38e6f6bf3..1a068eaff 100644 --- a/cmd/server-main.go +++ b/cmd/server-main.go @@ -172,6 +172,12 @@ var ServerFlags = []cli.Flag{ Hidden: true, EnvVar: "MINIO_CROSSDOMAIN_XML", }, + cli.StringFlag{ + Name: "memlimit", + Usage: "set global memory limit per server via GOMEMLIMIT", + Hidden: true, + EnvVar: "MINIO_MEMLIMIT", + }, } var gatewayCmd = cli.Command{ @@ -731,7 +737,7 @@ func serverMain(ctx *cli.Context) { // Set system resources to maximum. bootstrapTrace("setMaxResources", func() { - _ = setMaxResources() + _ = setMaxResources(ctx) }) // Verify kernel release and version. diff --git a/cmd/server-rlimit.go b/cmd/server-rlimit.go index 6a3611b4e..51fe8a811 100644 --- a/cmd/server-rlimit.go +++ b/cmd/server-rlimit.go @@ -21,6 +21,8 @@ import ( "runtime" "runtime/debug" + "github.com/dustin/go-humanize" + "github.com/minio/cli" "github.com/minio/madmin-go/v3/kernel" "github.com/minio/minio/internal/logger" "github.com/minio/pkg/v2/sys" @@ -43,7 +45,7 @@ func oldLinux() bool { return currentKernel < kernel.Version(4, 0, 0) } -func setMaxResources() (err error) { +func setMaxResources(ctx *cli.Context) (err error) { // Set the Go runtime max threads threshold to 90% of kernel setting. sysMaxThreads, err := sys.GetMaxThreads() if err == nil { @@ -75,6 +77,27 @@ func setMaxResources() (err error) { return err } + // set debug memory limit instead of GOMEMLIMIT env + _ = setDebugMemoryLimit(ctx) + err = sys.SetMaxMemoryLimit(maxLimit, maxLimit) return err } + +func setDebugMemoryLimit(ctx *cli.Context) error { + if ctx == nil { + return nil + } + if ctx.IsSet("memlimit") { + memlimit := ctx.String("memlimit") + if memlimit == "" { + memlimit = ctx.GlobalString("memlimit") + } + mlimit, err := humanize.ParseBytes(memlimit) + if err != nil { + return err + } + debug.SetMemoryLimit(int64(mlimit)) + } + return nil +} diff --git a/cmd/test-utils_test.go b/cmd/test-utils_test.go index acf3b52f5..c41cba2ed 100644 --- a/cmd/test-utils_test.go +++ b/cmd/test-utils_test.go @@ -106,7 +106,7 @@ func TestMain(m *testing.M) { // logger.AddTarget(console.New()) // Set system resources to maximum. - setMaxResources() + setMaxResources(nil) // Initialize globalConsoleSys system globalConsoleSys = NewConsoleLogger(context.Background())