diff --git a/app/vmselect/main.go b/app/vmselect/main.go index 7f466eddb..7c73a0ba0 100644 --- a/app/vmselect/main.go +++ b/app/vmselect/main.go @@ -21,10 +21,25 @@ import ( var ( deleteAuthKey = flag.String("deleteAuthKey", "", "authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series") - maxConcurrentRequests = flag.Int("search.maxConcurrentRequests", runtime.GOMAXPROCS(-1)*2, "The maximum number of concurrent search requests. It shouldn't exceed 2*vCPUs for better performance. See also -search.maxQueueDuration") - maxQueueDuration = flag.Duration("search.maxQueueDuration", 10*time.Second, "The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached") + maxConcurrentRequests = flag.Int("search.maxConcurrentRequests", getDefaultMaxConcurrentRequests(), "The maximum number of concurrent search requests. "+ + "It shouldn't be high, since a single request can saturate all the CPU cores. See also `-search.maxQueueDuration`") + maxQueueDuration = flag.Duration("search.maxQueueDuration", 10*time.Second, "The maximum time the request waits for execution when `-search.maxConcurrentRequests` limit is reached") ) +func getDefaultMaxConcurrentRequests() int { + n := runtime.GOMAXPROCS(-1) + if n <= 4 { + n *= 2 + } + if n > 16 { + // A single request can saturate all the CPU cores, so there is no sense + // in allowing higher number of concurrent requests - they will just contend + // for unavailable CPU time. + n = 16 + } + return n +} + // Init initializes vmselect func Init() { tmpDirPath := *vmstorage.DataPath + "/tmp"