mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-01 14:47:38 +00:00
9f42fccfc2
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>
(cherry picked from commit f255800da3
)
Signed-off-by: hagen1778 <roman@victoriametrics.com>
# Conflicts:
# app/vminsert/common/insert_ctx_pool.go
39 lines
707 B
Go
39 lines
707 B
Go
package common
|
|
|
|
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(0)
|
|
select {
|
|
case insertCtxPoolCh <- ctx:
|
|
default:
|
|
insertCtxPool.Put(ctx)
|
|
}
|
|
}
|
|
|
|
var (
|
|
insertCtxPool sync.Pool
|
|
insertCtxPoolCh = make(chan *InsertCtx, cgroup.AvailableCPUs())
|
|
)
|