news 2026/6/20 3:26:54

从`node_cpu_seconds_total`到告警:手把手教你用PromQL计算Node Exporter核心指标

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从`node_cpu_seconds_total`到告警:手把手教你用PromQL计算Node Exporter核心指标

node_cpu_seconds_total到告警:手把手教你用PromQL计算Node Exporter核心指标

当你第一次打开Node Exporter的/metrics端点时,那些密密麻麻的指标数据可能会让你感到无从下手。作为Prometheus监控体系中最基础的数据采集组件,Node Exporter提供了数百个系统指标,但如何将这些原始数据转化为有业务意义的监控图表和告警规则?这正是PromQL大显身手的地方。

本文将聚焦CPU、内存、磁盘三大核心系统指标,通过数学推导式的讲解,带你一步步理解如何从原始Counter类型指标开始,经过层层计算最终得到可直接用于监控的可视化数据。不同于简单的查询语句复制粘贴,我们会深入每个计算步骤背后的设计思路,让你真正掌握PromQL的精髓。

1. CPU使用率:从时间计数器到百分比

理解CPU使用率的计算逻辑是掌握系统监控的第一步。Node Exporter提供的node_cpu_seconds_total是一个典型的Counter类型指标,它记录了CPU在各种模式下累积消耗的时间(单位:秒)。当我们看到这样的数据时:

node_cpu_seconds_total{cpu="0",mode="idle"} 13172.76 node_cpu_seconds_total{cpu="0",mode="user"} 79.93 node_cpu_seconds_total{cpu="1",mode="system"} 309.38

首先需要明确几个关键点:

  • 这是一个累积值,从系统启动开始不断累加
  • 每个CPU核心都有独立的统计(cpu="0", cpu="1"等)
  • 区分了多种工作模式(idle, user, system等)

1.1 Counter类型的特点与处理

Counter类型指标的特点是只增不减(除非系统重启)。要计算CPU使用率这类百分比指标,我们需要关注的是时间窗口内的变化量而非绝对值。这就是为什么PromQL提供了rate()increase()函数:

# 计算5分钟内CPU空闲时间的平均增长速率(单位:秒/秒) rate(node_cpu_seconds_total{mode="idle"}[5m]) # 计算5分钟内CPU空闲时间的总增量(单位:秒) increase(node_cpu_seconds_total{mode="idle"}[5m])

提示:在大多数场景下,rate()increase()更推荐使用,因为它能更好地处理Counter重置(如进程重启)的情况。

1.2 多核CPU的聚合计算

现代服务器通常都有多个CPU核心,我们需要将所有核心的数据聚合起来才能反映整体CPU使用情况。这里就需要用到sum()聚合运算符:

sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)

这个查询做了三件事:

  1. 使用rate()计算5分钟时间窗口内idle模式的CPU时间增长率
  2. 使用sum()聚合所有CPU核心的数据
  3. 通过by (instance)保留实例标签,确保不同主机的数据不会混在一起

1.3 最终使用率计算公式

CPU使用率的本质是"非空闲时间占总时间的比例"。因此最直观的计算方式是:

( 1 - sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) / sum(rate(node_cpu_seconds_total[5m])) by (instance) ) * 100

这个查询可以分解为:

  1. 分母计算所有模式的总CPU时间
  2. 分子计算空闲CPU时间
  3. 用1减去空闲比例得到使用比例
  4. 乘以100转换为百分比

2. 内存使用率:理解available与free的区别

内存监控比CPU稍微复杂一些,因为Linux内存管理机制中有buffer和cache的概念。Node Exporter提供了多个内存相关指标:

node_memory_MemTotal_bytes # 总内存 node_memory_MemFree_bytes # 完全空闲内存 node_memory_Buffers_bytes # 缓冲区内存 node_memory_Cached_bytes # 页面缓存 node_memory_MemAvailable_bytes # 估算的可用内存

2.1 可用内存的准确计算

free命令输出的"available"内存是一个估算值,表示在不使用swap的情况下,应用程序可以实际使用的内存量。它的计算逻辑大致是:

可用内存 ≈ MemFree + Buffers + Cached - 不可回收部分

在PromQL中,我们可以用以下查询近似计算可用内存:

node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes

注意:这只是一个近似值,精确值应该直接使用node_memory_MemAvailable_bytes指标(如果内核版本支持)。

2.2 内存使用率的最佳实践

与CPU不同,内存使用率的计算应该基于"已用内存/总内存"而非"1 - 空闲比例",因为buffer和cache也属于被使用的内存(尽管可以被回收)。推荐的计算公式是:

( (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes ) * 100

这个查询更准确地反映了系统内存压力,因为它考虑了buffer/cache等可回收内存的实际使用情况。

3. 磁盘空间与IO监控

磁盘监控通常分为两部分:存储空间使用情况和IO性能指标。Node Exporter为两者都提供了详细的指标。

3.1 磁盘空间使用率

磁盘空间相关的主要指标包括:

node_filesystem_size_bytes # 文件系统总大小 node_filesystem_avail_bytes # 可用空间 node_filesystem_files # inode总数 node_filesystem_files_free # 空闲inode数

计算磁盘使用率时,通常需要过滤掉特殊文件系统(如tmpfs):

( 1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} ) * 100

对于inode使用率的计算也类似:

( 1 - node_filesystem_files_free{fstype=~"ext4|xfs"} / node_filesystem_files{fstype=~"ext4|xfs"} ) * 100

3.2 磁盘IO性能指标

磁盘IO监控主要关注读写操作的吞吐量和延迟:

node_disk_read_bytes_total # 读取字节数 node_disk_written_bytes_total # 写入字节数 node_disk_io_time_seconds_total # IO耗时 node_disk_reads_completed_total # 完成读操作数 node_disk_writes_completed_total # 完成写操作数

计算磁盘读写吞吐量(单位:MB/s):

# 读吞吐量 sum by(instance) ( rate(node_disk_read_bytes_total[5m]) ) / 1024 / 1024 # 写吞吐量 sum by(instance) ( rate(node_disk_written_bytes_total[5m]) ) / 1024 / 1024

监控IO延迟(单位:毫秒):

# 平均读延迟 ( rate(node_disk_read_time_seconds_total[5m]) / rate(node_disk_reads_completed_total[5m]) ) * 1000 # 平均写延迟 ( rate(node_disk_write_time_seconds_total[5m]) / rate(node_disk_writes_completed_total[5m]) ) * 1000

4. 从监控到告警:关键指标的阈值设置

有了基础监控指标后,下一步就是设置合理的告警规则。以下是几个核心指标的告警建议:

4.1 CPU告警规则

- alert: HighCPUUsage expr: | 100 - ( avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 ) > 80 for: 10m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}" description: "CPU usage is {{ $value }}% for last 10 minutes"

4.2 内存告警规则

- alert: HighMemoryUsage expr: | ( (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes ) * 100 > 90 for: 15m labels: severity: warning annotations: summary: "High memory usage on {{ $labels.instance }}" description: "Memory usage is {{ $value }}% for last 15 minutes"

4.3 磁盘空间告警规则

- alert: LowDiskSpace expr: | ( node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} ) * 100 < 10 for: 1h labels: severity: critical annotations: summary: "Low disk space on {{ $labels.instance }} {{ $labels.mountpoint }}" description: "Only {{ $value }}% space left"

在实际生产环境中,我发现磁盘空间告警的for时间应该设置得比CPU/内存更长一些,因为磁盘空间问题通常不会在短时间内自动恢复,而且误报可能会引发不必要的紧急响应。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 8:41:09

Proteus里没有16x16点阵?手把手教你导入自定义模型并驱动显示汉字

Proteus仿真进阶&#xff1a;从零构建16x16点阵模型与汉字滚动显示实战在嵌入式系统仿真领域&#xff0c;Proteus作为业界标杆工具&#xff0c;其标准元件库的局限性常常成为开发者进阶路上的绊脚石。当我们需要实现16x16点阵显示汉字这类常见需求时&#xff0c;会发现官方库仅…

作者头像 李华
网站建设 2026/6/9 8:38:11

别再只刷LeetCode了!牛客网ACM模式实战指南(附Java输入输出模板)

牛客网ACM模式通关手册&#xff1a;Java选手的输入输出实战精要第一次在牛客网笔试时盯着屏幕上的System.in发呆的经历&#xff0c;相信很多Java开发者都记忆犹新。当习惯了LeetCode只需关注算法逻辑的核心代码模式后&#xff0c;突然面对需要自己处理输入输出的ACM模式&#x…

作者头像 李华
网站建设 2026/6/9 8:36:54

Consistency Models:单步生成高质量图像的扩散模型

文章目录Consistency Models&#xff1a;单步生成高质量图像的扩散模型Consistency Models&#xff1a;单步生成高质量图像的扩散模型 OpenAI 开源的 Consistency Models&#xff0c;在 GitHub 上获得了 6,488 个 Star&#xff1a; Consistency Models 是一个基于 PyTorch 的代…

作者头像 李华