mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-22 08:26:19 +01:00
f255800da3
Production workload shows that it's useful optimisation. Channel based objects pool allows to handle irregural data ingestion requests and make memory allocations more smooth. It's improves sync.Pool efficiency, since objects from sync.Pool removed after 2 GC cycles. With GOGC=30 value, GC runs significantly more often. https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6733 ### Checklist The following checks are **mandatory**: - [ ] My change adheres [VictoriaMetrics contributing guidelines](https://docs.victoriametrics.com/contributing/). --------- Signed-off-by: f41gh7 <nik@victoriametrics.com> Signed-off-by: hagen1778 <roman@victoriametrics.com> Co-authored-by: hagen1778 <roman@victoriametrics.com>
40 lines
710 B
Go
40 lines
710 B
Go
package netstorage
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/cgroup"
|
|
)
|
|
|
|
// GetInsertCtx returns InsertCtx from the pool.
|
|
//
|
|
// Call PutInsertCtx for returning it to the pool.
|
|
func GetInsertCtx() *InsertCtx {
|
|
select {
|
|
case ctx := <-insertCtxPoolCh:
|
|
return ctx
|
|
default:
|
|
if v := insertCtxPool.Get(); v != nil {
|
|
return v.(*InsertCtx)
|
|
}
|
|
return &InsertCtx{}
|
|
}
|
|
}
|
|
|
|
// PutInsertCtx returns ctx to the pool.
|
|
//
|
|
// ctx cannot be used after the call.
|
|
func PutInsertCtx(ctx *InsertCtx) {
|
|
ctx.Reset()
|
|
select {
|
|
case insertCtxPoolCh <- ctx:
|
|
default:
|
|
insertCtxPool.Put(ctx)
|
|
}
|
|
}
|
|
|
|
var (
|
|
insertCtxPool sync.Pool
|
|
insertCtxPoolCh = make(chan *InsertCtx, cgroup.AvailableCPUs())
|
|
)
|