From d0d258b314cf48d6c15ebef268fd372cecdb8e0b Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 17 Jan 2020 15:43:47 +0200 Subject: [PATCH] app/vmselect: limit the default value for `-search.maxConcurrentRequests`, so it plays well on systems with more than 16 vCPUs A single heavy request can saturate all the available CPUs, so let's limit the number of concurrent requests to lower value. This will give more chances for executing insert path. --- app/vmselect/main.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/app/vmselect/main.go b/app/vmselect/main.go index 7f466eddbc..7c73a0ba0d 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"