From 1c58c00618c6b89ee042d84085b74753ff2683df Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin <valyala@victoriametrics.com> Date: Tue, 23 Jan 2024 22:29:29 +0200 Subject: [PATCH] app/vmselect/netstorage: limit the initial size for brsPoolCap with 32Kb This should reduce the number of expensive memory allocations with sizes bigger than 32Kb --- app/vmselect/netstorage/netstorage.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/vmselect/netstorage/netstorage.go b/app/vmselect/netstorage/netstorage.go index a2c3b8286a..17aace7935 100644 --- a/app/vmselect/netstorage/netstorage.go +++ b/app/vmselect/netstorage/netstorage.go @@ -1167,7 +1167,11 @@ func ProcessSearchQuery(qt *querytracer.Tracer, sq *storage.SearchQuery, deadlin // brsPool is used for holding the most of blockRefs.brs slices across all the loaded time series. // It should reduce pressure on Go GC by reducing the number of allocations for blockRefs.brs slices. - brsPool := make([]blockRef, 0, maxSeriesCount) + brsPoolCap := uintptr(maxSeriesCount) + if brsPoolCap > maxFastAllocBlockSize/unsafe.Sizeof(blockRef{}) { + brsPoolCap = maxFastAllocBlockSize / unsafe.Sizeof(blockRef{}) + } + brsPool := make([]blockRef, 0, brsPoolCap) // m maps from metricName to the index of blockRefs inside brssPool m := make(map[string]int, maxSeriesCount)