From 77c597738cb1db719a3f458cd660b63e89412f3e Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sat, 20 Apr 2024 21:27:03 +0200 Subject: [PATCH] app/vmagent/common: use plain sync.Pool instead of a mix of sync.Pool with channel-based pool for PushCtx This scheme was used for reducing memory usage when vmagent runs on a machine with big number of CPU cores and the ingestion rate isn't too big. The scheme with channel-based pool could reduce memory usage, since it minimizes the number of PushCtx structs in the pool in this case. Performance tests didn't reveal significant difference in memory usage under both low and high ingestion rate between plain sync.Pool and the current hybrid scheme, so replace the scheme with plain sync.Pool in order to simplify the code. --- app/vmagent/common/push_ctx.go | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/app/vmagent/common/push_ctx.go b/app/vmagent/common/push_ctx.go index 950577c07..1147a3e85 100644 --- a/app/vmagent/common/push_ctx.go +++ b/app/vmagent/common/push_ctx.go @@ -3,13 +3,15 @@ package common import ( "sync" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/cgroup" "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promrelabel" ) // PushCtx is a context used for populating WriteRequest. type PushCtx struct { + // WriteRequest contains the WriteRequest, which must be pushed later to remote storage. + // + // The actual labels and samples for the time series are stored in Labels and Samples fields. WriteRequest prompbmarshal.WriteRequest // Labels contains flat list of all the labels used in WriteRequest. @@ -33,15 +35,10 @@ func (ctx *PushCtx) Reset() { // // Call PutPushCtx when the ctx is no longer needed. func GetPushCtx() *PushCtx { - select { - case ctx := <-pushCtxPoolCh: - return ctx - default: - if v := pushCtxPool.Get(); v != nil { - return v.(*PushCtx) - } - return &PushCtx{} + if v := pushCtxPool.Get(); v != nil { + return v.(*PushCtx) } + return &PushCtx{} } // PutPushCtx returns ctx to the pool. @@ -49,12 +46,7 @@ func GetPushCtx() *PushCtx { // ctx mustn't be used after returning to the pool. func PutPushCtx(ctx *PushCtx) { ctx.Reset() - select { - case pushCtxPoolCh <- ctx: - default: - pushCtxPool.Put(ctx) - } + pushCtxPool.Put(ctx) } var pushCtxPool sync.Pool -var pushCtxPoolCh = make(chan *PushCtx, cgroup.AvailableCPUs())