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

This commit is contained in:
Harshavardhana 2020-09-04 19:37:37 -07:00 committed by GitHub
parent b0e1d4ce78
commit 572b1721b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 9 deletions

View File

@ -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)

View File

@ -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
}