Files
tidb/pkg/metrics/memory.go

194 lines
6.7 KiB
Go

// Copyright 2025 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package metrics
import (
"sync"
metricscommon "github.com/pingcap/tidb/pkg/metrics/common"
"github.com/prometheus/client_golang/prometheus"
)
const (
namespace = "tidb"
subsystem = "memory"
)
// Memory metrics.
var (
GlobalMemArbitrationDuration prometheus.Histogram
GlobalMemArbitratorWorkMode prometheus.GaugeVec
GlobalMemArbitratorQuota prometheus.GaugeVec
GlobalMemArbitratorWaitingTask prometheus.GaugeVec
GlobalMemArbitratorRuntimeMemMagnifi prometheus.Gauge
GlobalMemArbitratorRootPool prometheus.GaugeVec
GlobalMemArbitratorEventCounter prometheus.CounterVec
GlobalMemArbitratorSubEvents struct {
PoolInitHitDigest prometheus.Counter
PoolInitReserve prometheus.Counter
PoolInitMediumQuota prometheus.Counter
PoolInitNone prometheus.Counter
}
GlobalMemArbitratorTaskExecCounter prometheus.CounterVec
GlobalMemArbitratorSubTasks struct {
CancelWaitAverseParse prometheus.Counter
CancelWaitAversePlan prometheus.Counter
CancelStandardModeParse prometheus.Counter
CancelStandardModePlan prometheus.Counter
ForceKillParse prometheus.Counter
ForceKillPlan prometheus.Counter
NoLimit prometheus.Counter
}
counters struct {
c map[string]prometheus.Counter
sync.RWMutex
}
gauges struct {
g map[string]prometheus.Gauge
sync.RWMutex
}
)
// InitMemoryMetrics initializes the memory metrics for the global memory arbitrator.
func InitMemoryMetrics() {
GlobalMemArbitrationDuration = metricscommon.NewHistogram(prometheus.HistogramOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitration_duration_seconds",
Help: "Bucketed histogram of mem quota arbitration time (s) in SQL execution",
Buckets: prometheus.ExponentialBucketsRange(0.00005 /*50us*/, 3600*24 /*1d*/, 17),
})
GlobalMemArbitratorQuota = *metricscommon.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_quota_bytes",
Help: "Quota info of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorWorkMode = *metricscommon.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_work_mode",
Help: "Work mode of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorWaitingTask = *metricscommon.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_waiting_task",
Help: "Waiting task num of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorRuntimeMemMagnifi = metricscommon.NewGauge(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_magnifi_ratio",
Help: "Runtime profile (heapinuse vs. quota) of the global memory arbitrator",
})
GlobalMemArbitratorRootPool = *metricscommon.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_root_pool",
Help: "Root pool info of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorTaskExecCounter = *metricscommon.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_task_exec",
Help: "Task execution count of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorEventCounter = *metricscommon.NewCounterVec(prometheus.CounterOpts{
Namespace: namespace,
Subsystem: subsystem,
Name: "arbitrator_event",
Help: "Event count of the global memory arbitrator",
}, []string{LblType})
GlobalMemArbitratorSubEvents.PoolInitHitDigest = GlobalMemArbitratorEventCounter.WithLabelValues("pool-init-hit-digest")
GlobalMemArbitratorSubEvents.PoolInitReserve = GlobalMemArbitratorEventCounter.WithLabelValues("pool-init-reserve")
GlobalMemArbitratorSubEvents.PoolInitMediumQuota = GlobalMemArbitratorEventCounter.WithLabelValues("pool-init-medium-quota")
GlobalMemArbitratorSubEvents.PoolInitNone = GlobalMemArbitratorEventCounter.WithLabelValues("pool-init-none")
GlobalMemArbitratorSubTasks.CancelWaitAverseParse = GlobalMemArbitratorTaskExecCounter.WithLabelValues("cancel-wait-averse-parse")
GlobalMemArbitratorSubTasks.CancelWaitAversePlan = GlobalMemArbitratorTaskExecCounter.WithLabelValues("cancel-wait-averse-plan")
GlobalMemArbitratorSubTasks.CancelStandardModeParse = GlobalMemArbitratorTaskExecCounter.WithLabelValues("cancel-standard-mode-parse")
GlobalMemArbitratorSubTasks.CancelStandardModePlan = GlobalMemArbitratorTaskExecCounter.WithLabelValues("cancel-standard-mode-plan")
GlobalMemArbitratorSubTasks.ForceKillParse = GlobalMemArbitratorTaskExecCounter.WithLabelValues("force-kill-parse")
GlobalMemArbitratorSubTasks.ForceKillPlan = GlobalMemArbitratorTaskExecCounter.WithLabelValues("force-kill-plan")
GlobalMemArbitratorSubTasks.NoLimit = GlobalMemArbitratorTaskExecCounter.WithLabelValues("nolimit")
}
// AddGlobalMemArbitratorCounter adds a counter for the global memory arbitrator.
func AddGlobalMemArbitratorCounter(counterVec prometheus.CounterVec, taskType string, count int64) {
var c prometheus.Counter
{
counters.RLock()
c = counters.c[taskType]
counters.RUnlock()
}
if c == nil {
c = counterVec.WithLabelValues(taskType)
{
counters.Lock()
if counters.c == nil {
counters.c = make(map[string]prometheus.Counter)
}
counters.c[taskType] = c
counters.Unlock()
}
}
c.Add(float64(count))
}
// SetGlobalMemArbitratorGauge sets a gauge for the global memory arbitrator.
func SetGlobalMemArbitratorGauge(gaugeVec prometheus.GaugeVec, taskType string, value int64) {
var g prometheus.Gauge
{
gauges.RLock()
g = gauges.g[taskType]
gauges.RUnlock()
}
if g == nil {
g = gaugeVec.WithLabelValues(taskType)
{
gauges.Lock()
if gauges.g == nil {
gauges.g = make(map[string]prometheus.Gauge)
}
gauges.g[taskType] = g
gauges.Unlock()
}
}
g.Set(float64(value))
}
// ResetGlobalMemArbitratorGauge resets all gauges for the global memory arbitrator to zero.
func ResetGlobalMemArbitratorGauge() {
gauges.RLock()
defer gauges.RUnlock()
for _, g := range gauges.g {
g.Set(0)
}
}