Prometheus常用监控指标介绍
deepseek解释
1、cpu使用率
promql表达式:100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) * 100)
可以拆解为:
- 
node_cpu_seconds_total{mode="idle"}- 
获取所有表示 CPU 空闲时间的指标(Counter 类型) 
- 
标签 mode="idle"过滤出空闲状态的 CPU 时间
 
- 
- 
irate(...[5m])- 
计算该指标在 5 分钟窗口内的 瞬时增长率(单位:秒/秒) 
- 
公式: (最新值 - 前一个值) / 时间间隔(秒)
 
- 
- 
avg() by (instance)- 
对每个 instance(服务器实例)的多个 CPU 核心的空闲率求平均值
- 
多核服务器需要聚合所有核心的数据 
 
- 
- 
* 100- 
将比例值转换为百分比(例如 0.8 → 80) 
 
- 
- 
100 - (...)- 
用 100% 减去空闲百分比,得到 CPU 使用率 
 
- 
该 PromQL 的核心逻辑是:
CPU使用率 = 100% - (CPU空闲时间占比)
Q1: 为什么用 irate 而不是 rate?
- 
irate使用最后两个数据点,更适合捕捉短期波动
- 
rate会平滑 5 分钟内所有数据,可能掩盖瞬时峰值
2、内存使用率
promql表达式: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
(1)传统计算方式
Used = MemTotal - MemFree - Buffers - Cached
Usage% = (Used / MemTotal) * 100
存在问题:低估实际使用率,因为缓存(Cached)可能被应用快速回收
(2)现代计算方式(推荐)
Used = MemTotal - MemAvailable
Usage% = (Used / MemTotal) * 100
优势:MemAvailable 包含可回收缓存,更准确反映实际可用内存
3、磁盘 I/O 使用率(%util)
promql表达式: 100 * rate(node_disk_io_time_seconds_total{device=~"sd.*"}[1m])
- 
含义:磁盘设备(如 /dev/sda)处于忙碌状态的总秒数(从系统启动开始累计)
- 
关键标签: - 
device:磁盘设备名(如sda,nvme0n1)
- 
fstype:文件系统类型(需额外过滤)
 
- 
(1)传统使用率计算
%util = (设备繁忙时间 / 采样间隔时间) * 100
实现原理:
- 
内核通过 blk_account_io_done()统计设备繁忙时间
- 
采样间隔通常为1秒(如 iostat 1)
(2)现代多队列(MQ)计算
对于NVMe等高性能设备:
%util = max(
  (sum(各CPU队列繁忙时间) / (cores × 采样间隔)),
  (传统%util计算)
)
4、磁盘空间使用率%
promql表达式:100 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs", mountpoint="/"} / node_filesystem_size_bytes{fstype=~"ext4|xfs", mountpoint="/"} * 100)
node_filesystem_free_bytes与 node_filesystem_avail_bytes 的关键区别: node_filesystem_free_bytes只计算完全未使用的空间,不含可回收缓存,avail_bytes (推荐)包含可被普通用户程序回收的缓存空间(更准确反映真实可用空间)
5、[$interval] 
在 Prometheus 和 Grafana 中,[$interval] 是一个动态时间范围变量,用于自动适配查询的时间间隔。它不是 PromQL 的原生语法,而是主要在 Grafana 仪表盘中使用。
1. [$interval] 的含义和作用
(1)基本定义
- 
[$interval]是 Grafana 自动计算的时间间隔,表示每个数据点覆盖的时间范围。
- 
它根据当前仪表盘的时间范围和图表宽度动态调整,确保数据点数量适中,平衡精度和性能。 
(2)简单示例
假设:
- 
仪表盘时间范围:最近 1 小时 
- 
图表宽度:600 像素 
Grafana 可能自动设置 $interval = 10s,即每 10 秒一个数据点(共 360 个点)。
在 PromQL 中的使用场景
(1)rate()、irate()、increase() 函数
这些函数必须指定时间范围(如 [5m]、[1h])。[$interval] 可动态适配该范围:
rate(http_requests_total[$interval])
(2)Grafana 变量替换
在 Grafana 面板的 PromQL 查询中,[$interval] 会被自动替换为实际值:
# 在 Grafana 中书写:
rate(node_cpu_seconds_total{mode="idle"}[$interval])
# Grafana 实际执行(假设 interval=15s):
rate(node_cpu_seconds_total{mode="idle"}[15s])
为什么需要 [$interval]?
(1)自适应查询
- 
短时间范围(如最近 5 分钟): $interval可能为5s,提供高精度。
- 
长时间范围(如最近 7 天): $interval可能为1h,避免数据点过多。
(2)性能优化
- 
避免查询返回过多数据点(如 10,000+),导致浏览器渲染缓慢或 Prometheus 负载过高。 
示例对比
(1)固定间隔(不推荐)
rate(http_requests_total[1m])  # 始终用 1m,可能不适配所有时间范围
(2)动态间隔(推荐)
rate(http_requests_total[$interval])  # 自动适配当前视图
5、CPU Throttling
CPU Throttling(CPU 限流) 是容器编排平台(如 Kubernetes)对容器 CPU 使用的一种限制机制。当容器使用的 CPU 超过其设定的限制时,系统会强制让容器"暂停运行"一段时间,从而限制其 CPU 使用。CPU Throttling 值是一个百分比,表示:Throttling 百分比 = (被强制暂停的时间 / 总时间) × 100%
# 这些指标的实际意义 container_cpu_cfs_periods_total = 总的时间片周期数 container_cpu_cfs_throttled_periods_total = 被限制的周期数
promql表达式1(deepseek):
# 计算所有容器的 Throttling 比例 ( rate(container_cpu_cfs_throttled_periods_total{container!="", container!="POD"}[5m]) / rate(container_cpu_cfs_periods_total{container!="", container!="POD"}[5m]) ) * 100
promql表达式2(店J):
(sum(increase(container_cpu_cfs_throttled_periods_total{pod=~"$pod"}[5m])) by (container,pod) > 0) /(sum(increase(container_cpu_cfs_periods_total{pod=~"$pod"}[5m])) by (container,pod) > 0)
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号