Prometheus常用监控指标介绍

 

deepseek解释

1、cpu使用率

promql表达式:100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) * 100)

可以拆解为:

  1. node_cpu_seconds_total{mode="idle"}

    • 获取所有表示 CPU 空闲时间的指标(Counter 类型)

    • 标签 mode="idle" 过滤出空闲状态的 CPU 时间

  2. irate(...[5m])

    • 计算该指标在 5 分钟窗口内的 瞬时增长率(单位:秒/秒)

    • 公式:(最新值 - 前一个值) / 时间间隔(秒)

  3. avg() by (instance)

    • 对每个 instance(服务器实例)的多个 CPU 核心的空闲率求平均值

    • 多核服务器需要聚合所有核心的数据

  4. * 100

    • 将比例值转换为百分比(例如 0.8 → 80)

  5. 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:磁盘设备名(如 sdanvme0n1

    • 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)

 





 

posted @ 2025-08-17 01:20  苦逼yw  阅读(151)  评论(0)    收藏  举报