Prometheus node_exporter 指标说明及告警规则表达

说明:这篇是 node_exporter 指标的查询指南,可以说是从入门到精通的手册。如果你在用 Grafana 搭监控面板,这里面的 PromQL 可以直接搬过去用。


一、基本信息(单值查询)

这些适合放在 Grafana 的 Singlestat 或 Stat 面板,一眼看到系统概况。

指标 PromQL 说明
CPU 核心数 count(count(node_cpu_seconds_total) by (cpu)) 物理 CPU 的总核心数
内存总量 node_memory_MemTotal_bytes 物理内存大小(bytes)
交换分区总量 node_memory_SwapTotal_bytes SWAP 总大小(bytes)
根分区大小 node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"} 根文件系统总空间
1 分钟平均负载 node_load1 load average 的第一列
系统运行时长 node_time_seconds - node_boot_time_seconds 从开机到现在跑了多久

二、使用率查询(百分比)

这些适合放在 Gauge 面板,显示当前资源用了多少。

CPU 使用率

# 方法 1:基于空闲率反算
100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

内存使用率

# 包含 Buffer/Cache(保守算法)
((node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100

# 不包含 Buffer/Cache(更准确,反映应用实际占用)
100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)

两种算法的区别:第一种把 Buffer/Cache 也算在"已用"里,第二种认为 Cache 可以回收,用 MemAvailable 当可用内存。推荐用第二种。

交换分区使用率

((node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes) * 100

根分区使用率

100 - (node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"} * 100)

CPU 负载率(相对 CPU 核心数)

# 1 分钟负载百分比
avg(node_load1) / count(count(node_cpu_seconds_total) by (cpu)) * 100

# 5 分钟负载百分比
avg(node_load5) / count(count(node_cpu_seconds_total) by (cpu)) * 100

三、CPU 详细分解(图表用)

把 CPU 按几种模式拆开看,适合 Grafana 的 stacked 面积图:

# System 态占比
sum by (instance)(rate(node_cpu_seconds_total{mode="system"}[5m])) * 100

# User 态占比
sum by (instance)(rate(node_cpu_seconds_total{mode="user"}[5m])) * 100

# Iowait(磁盘等待)
sum by (instance)(rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100

# 中断(硬中断 + 软中断)
sum by (instance)(rate(node_cpu_seconds_total{mode=~".*irq"}[5m])) * 100

# Idle 空闲
sum by (mode)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100

四、内存详细分解

把系统内存拆成几层来看,适合堆积面积图:

分类 PromQL
应用占用 MemTotal - MemFree - Buffers - Cached - Slab - PageTables - SwapCached
缓存 node_memory_Cached_bytes
缓冲 node_memory_Buffers_bytes
Slab node_memory_Slab_bytes
页表 node_memory_PageTables_bytes
空闲 node_memory_MemFree_bytes
交换分区 SwapTotal - SwapFree

五、网络流量

这里过滤掉了虚拟网卡(docker、veth、br 等),只看物理网卡:

# 接收速率(每 5 分钟平均)
rate(node_network_receive_bytes_total{device!~"lo|docker.*|veth.*|br.*"}[5m])

# 发送速率
rate(node_network_transmit_bytes_total{device!~"lo|docker.*|veth.*|br.*"}[5m])

如果需要更灵敏的瞬时速率,用 irate 替代 rate

# 瞬时接收速率
irate(node_network_receive_bytes_total{device!~"lo.*"}[5m])

六、磁盘 I/O

IOPS(每秒 I/O 操作次数)

# 读操作
irate(node_disk_reads_completed_total{device=~"[a-z]*[a-z]"}[5m])

# 写操作
irate(node_disk_writes_completed_total{device=~"[a-z]*[a-z]"}[5m])

读写吞吐量

# 读取字节
irate(node_disk_read_bytes_total{device=~"[a-z]*[a-z]"}[5m])

# 写入字节
irate(node_disk_written_bytes_total{device=~"[a-z]*[a-z]"}[5m])

I/O 耗时

# 磁盘 I/O 时间占比
irate(node_disk_io_time_seconds_total{device=~"[a-z]*[a-z]"}[5m])

七、系统其他指标

# 上下文切换速率
irate(node_context_switches_total[5m])

# 中断速率
irate(node_intr_total[5m])

# 正在运行的进程数
node_procs_running

# 阻塞的进程数
node_procs_blocked

# 进程创建速率
rate(node_forks_total[5m])

# 文件描述符使用率
process_open_fds / process_max_fds * 100

# 系统可用熵
node_entropy_available_bits

八、时间同步监控

# 时间同步状态(1=已同步,0=未同步)
node_timex_sync_status

# 时间偏移量(秒)
node_timex_offset_seconds

# 预估误差(秒)
node_timex_estimated_error_seconds

# 最大误差(秒)
node_timex_maxerror_seconds

九、硬件温度

# 当前温度
node_hwmon_temp_celsius

# 告警阈值
node_hwmon_temp_crit_celsius

# 是否触发过温告警
node_hwmon_temp_crit_alarm_celsius

十、连接跟踪

# 当前 conntrack 条目数
node_nf_conntrack_entries

# conntrack 上限
node_nf_conntrack_entries_limit

# 使用率
node_nf_conntrack_entries / node_nf_conntrack_entries_limit * 100

十一、node_exporter 自检

有时候查不出数据,先看看 exporter 自己有没有问题:

# 每个采集器的采集耗时
node_scrape_collector_duration_seconds

# 采集器是否成功(1=成功,0=失败)
node_scrape_collector_success

PromQL 使用小技巧

  1. rate vs irate

    • rate(metric[5m]):5 分钟内的平均速率,曲线平滑,适合带宽、磁盘吞吐
    • irate(metric[5m]):5 分钟内最后两个点的瞬时速率,曲线灵敏,适合 CPU、传感器
  2. 过滤虚拟网卡:写 device!~"lo|docker.*|veth.*|br.*|tap.*" 可以过滤掉虚拟接口,只关注物理网卡

  3. 计算百分比(实际值 / 总量) * 100 是最通用的公式,改一下指标名就能套用到内存、磁盘、连接数等场景

  4. 变量替换:原文中大量使用 instance=~"$node:$port",job=~"$job" 是 Grafana 的模板变量写法,在 Grafana 面板中可以直接用,手动查 Prometheus 时需要换成具体值

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐