set max API requests automatically based on RAM (#10421)

master
Harshavardhana 4 years ago committed by GitHub
parent b0e1d4ce78
commit 572b1721b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      cmd/config-current.go
  2. 25
      cmd/handler-api.go

@ -377,7 +377,7 @@ func lookupConfigs(s config.Config, setDriveCount int) {
logger.LogIf(ctx, fmt.Errorf("Invalid api configuration: %w", err)) logger.LogIf(ctx, fmt.Errorf("Invalid api configuration: %w", err))
} }
globalAPIConfig.init(apiConfig) globalAPIConfig.init(apiConfig, setDriveCount)
if globalIsErasure { if globalIsErasure {
globalStorageClass, err = storageclass.LookupConfig(s[config.StorageClassSubSys][config.Default], setDriveCount) globalStorageClass, err = storageclass.LookupConfig(s[config.StorageClassSubSys][config.Default], setDriveCount)

@ -22,6 +22,7 @@ import (
"time" "time"
"github.com/minio/minio/cmd/config/api" "github.com/minio/minio/cmd/config/api"
"github.com/minio/minio/pkg/sys"
) )
type apiConfig struct { type apiConfig struct {
@ -33,22 +34,30 @@ type apiConfig struct {
corsAllowOrigins []string corsAllowOrigins []string
} }
func (t *apiConfig) init(cfg api.Config) { func (t *apiConfig) init(cfg api.Config, setDriveCount int) {
t.mu.Lock() t.mu.Lock()
defer t.mu.Unlock() defer t.mu.Unlock()
t.readyDeadline = cfg.APIReadyDeadline t.readyDeadline = cfg.APIReadyDeadline
t.corsAllowOrigins = cfg.APICorsAllowOrigin t.corsAllowOrigins = cfg.APICorsAllowOrigin
var apiRequestsMaxPerNode int
if cfg.APIRequestsMax <= 0 { if cfg.APIRequestsMax <= 0 {
return stats, err := sys.GetStats()
} if err != nil {
return
apiRequestsMax := cfg.APIRequestsMax }
if len(globalEndpoints.Hostnames()) > 0 { // max requests per node is calculated as
apiRequestsMax /= len(globalEndpoints.Hostnames()) // 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())
}
} }
t.requestsPool = make(chan struct{}, apiRequestsMax) t.requestsPool = make(chan struct{}, apiRequestsMaxPerNode)
t.requestsDeadline = cfg.APIRequestsDeadline t.requestsDeadline = cfg.APIRequestsDeadline
} }

Loading…
Cancel
Save