From 572b1721b278c3db62eade1e5f56f184ded1cee1 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 4 Sep 2020 19:37:37 -0700 Subject: [PATCH] set max API requests automatically based on RAM (#10421) --- cmd/config-current.go | 2 +- cmd/handler-api.go | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cmd/config-current.go b/cmd/config-current.go index 7f5e2c1bc..f2a673f5b 100644 --- a/cmd/config-current.go +++ b/cmd/config-current.go @@ -377,7 +377,7 @@ func lookupConfigs(s config.Config, setDriveCount int) { logger.LogIf(ctx, fmt.Errorf("Invalid api configuration: %w", err)) } - globalAPIConfig.init(apiConfig) + globalAPIConfig.init(apiConfig, setDriveCount) if globalIsErasure { globalStorageClass, err = storageclass.LookupConfig(s[config.StorageClassSubSys][config.Default], setDriveCount) diff --git a/cmd/handler-api.go b/cmd/handler-api.go index 769f4961c..076c1e1df 100644 --- a/cmd/handler-api.go +++ b/cmd/handler-api.go @@ -22,6 +22,7 @@ import ( "time" "github.com/minio/minio/cmd/config/api" + "github.com/minio/minio/pkg/sys" ) type apiConfig struct { @@ -33,22 +34,30 @@ type apiConfig struct { corsAllowOrigins []string } -func (t *apiConfig) init(cfg api.Config) { +func (t *apiConfig) init(cfg api.Config, setDriveCount int) { t.mu.Lock() defer t.mu.Unlock() t.readyDeadline = cfg.APIReadyDeadline t.corsAllowOrigins = cfg.APICorsAllowOrigin + var apiRequestsMaxPerNode int if cfg.APIRequestsMax <= 0 { - return + stats, err := sys.GetStats() + if err != nil { + return + } + // max requests per node is calculated as + // total_ram / ram_per_request + // ram_per_request is 4MiB * setDriveCount + 2 * 10MiB (default erasure block size) + apiRequestsMaxPerNode = int(stats.TotalRAM / uint64(setDriveCount*readBlockSize+blockSizeV1*2)) + } else { + apiRequestsMaxPerNode = cfg.APIRequestsMax + if len(globalEndpoints.Hostnames()) > 0 { + apiRequestsMaxPerNode /= len(globalEndpoints.Hostnames()) + } } - apiRequestsMax := cfg.APIRequestsMax - if len(globalEndpoints.Hostnames()) > 0 { - apiRequestsMax /= len(globalEndpoints.Hostnames()) - } - - t.requestsPool = make(chan struct{}, apiRequestsMax) + t.requestsPool = make(chan struct{}, apiRequestsMaxPerNode) t.requestsDeadline = cfg.APIRequestsDeadline }