第3篇 主机层监控实战:node_exporter 核心指标与告警

13 阅读9分钟

从传统物理机、虚拟机到云原生环境,基础设施的形态在变,但主机层的基础指标始终是性能分析与稳定性排查的基石。CPU、内存、磁盘、网络这四类资源的数据,几乎决定了上层应用能否平稳运行。也正因如此,如何高效、准确地采集这些指标,成为可观测性建设中绕不开的第一步。

node_exporter 正是为这一目标而生的。它是 Prometheus 官方维护的主机指标导出器,隶属于 CNCF 生态,使用 Go 语言编写。它遵循 Prometheus 的文本指标格式,通过 50 多个 Collector 从 /proc、/sys 等内核接口读取硬件与操作系统指标,再经由 HTTP :9100/metrics 端点暴露给 Prometheus 拉取。在整个 Prometheus 监控体系中,它扮演着 Exporter 这一关键角色。

如今,node_exporter 已成为 Linux 主机指标采集事实上的标准方案。在云原生与 Kubernetes 环境中,它通常以 DaemonSet 方式在每个节点部署一个实例,配合 hostNetwork、hostPID 获取节点的物理指标,并与 Prometheus、Grafana、Alertmanager 组成一套成熟的监控告警组合。

横向对比来看,Telegraf 插件丰富,更适合 push 模式与中间件采集;Zabbix Agent 扎根传统机房,主动加被动功能全面但相对较重;而 node_exporter 胜在轻量与专注——只做主机基础资源这一件事,却与 Prometheus 生态深度集成,因而成为 K8s 场景的首选。

正因如此,掌握 node_exporter 的安装、核心指标与告警配置,是构建主机层可观测性的基础。本文即围绕这三点逐一展开。

一、node_exporter 安装

1、二进制文件安装

下载地址:github.com/prometheus/…

$ tar xvfz node_exporter-1.12.1.linux-amd64.tar.gz

$ sudo cp node_exporter-1.12.1.linux-amd64/node_exporter /usr/local/bin/

创建 Node Exporter 的 systemd 服务文件

$ sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=root
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

启动并使 Node Exporter 服务开机自启

$ sudo systemctl start node_exporter

$ sudo systemctl enable node_exporter

验证

http://127.0.0.1:9100/metrics

2、容器方式安装

通过 Docker 直接进行部署:

docker run -d \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  quay.io/prometheus/node-exporter:latest \
    --path.rootfs=/host

若部署环境为 Kubernetes(k8s),则采用 DaemonSet 方式,在每个宿主机节点上自动安装 node-exporter。

二、核心指标解析

1、CPU 指标

Collector: cpu | 来源: /proc/stat

核心指标 node_cpu_seconds_total{cpu, mode} 是 Counter 类型,记录每颗 CPU 核心在各模式下累计运行的秒数。常见 mode 标签:idle、user、system、iowait、steal、irq、softirq、nice。

主要指标:

Prometheus 指标名指标类型含义说明
node_cpu_seconds_totalCounterCPU 花费在不同模式(如 user、system、idle)下的累计秒数,用于计算 CPU 使用率

常用 PromQL:

# 整机 CPU 使用率(%)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 按核心查看 CPU 使用率
100 - (avg by(instance, cpu) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# iowait 占比(高值提示磁盘瓶颈)
avg by(instance) (rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100

分析要点:

  • 使用率持续 > 85% 判定严重,70%-85% 判定警告
  • iowait 持续 > 20% 需关联检查磁盘 I/O 指标

各 mode 标签含义:

标签名称含义
idle空闲CPU 空闲,没有任务在跑。idle 高 = CPU 不忙;idle 低 = CPU 繁忙。
user用户态运行用户程序消耗的 CPU(业务代码、应用进程,不含内核)。user 高:业务应用本身计算量大。
system (sys)内核态操作系统内核执行的 CPU 时间(系统调用、内存管理、进程调度等)。sys 高:频繁系统调用、锁竞争、内核开销大。
nice低优先级用户态nice 值调整过优先级的用户进程占用 CPU。一般服务器默认接近 0,手动调低进程优先级才会上涨。
iowaitIO 等待CPU 等待磁盘 IO 完成的时间。⚠️ 重点:不是 CPU 忙,是进程在等磁盘。iowait 高说明磁盘瓶颈,CPU 没事干在等 IO。
irq硬中断硬件中断占用 CPU 时间(网卡、磁盘控制器等硬件发来中断信号)。irq 飙升:网卡流量巨大、磁盘硬件中断频繁。
softirq软中断内核的软件中断(中断下半部,比如网络收包、定时器)。softirq 高:常见于网络大包、高并发网络流量。
steal窃取时间虚拟化环境(KVM/VMware)专用。宿主机把 CPU 时间抢走给其他虚拟机。steal>0:当前虚拟机 CPU 资源被宿主机上其他 VM 抢占,虚拟机 CPU 资源不足。

2、内存指标

Collector: meminfo | 来源: /proc/meminfo

主要指标:

Prometheus 指标名指标类型含义说明
node_memory_MemTotal_bytesGauge物理内存总量
node_memory_MemAvailable_bytesGauge可用内存(含可回收缓存)
node_memory_MemFree_bytesGauge完全空闲内存
node_memory_Buffers_bytesGauge内核缓冲区
node_memory_Cached_bytesGauge页面缓存
node_memory_SwapTotal_bytesGaugeSwap 总量
node_memory_SwapFree_bytesGaugeSwap 空闲

常用 PromQL:

# 内存使用率(%)
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

# Swap 使用率(持续增长说明内存不足)
(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100

# 整机内存使用变化速率(MB/s,检测内存泄漏)
# > 200  主机内存持续消耗 {{ $value }} MB/h
- increase(node_memory_MemAvailable_bytes[1h]) /1024/1024
increase(node_memory_MemAvailable_bytes[1h]) * -1 / 1024 / 1024

分析要点:

  • 可用内存持续下降且不回收,可能存在内存泄漏
  • Swap 使用量 > 0 表明物理内存不足,需关注性能影响
  • Available 内存 < 总内存 10% 判定严重
  • 主机内存持续消耗,如持续3小时消耗200M/h,可能存在内存泄漏,功能与第一条相似

3、磁盘 I/O 指标

Collector: diskstats | 来源: /proc/diskstats

主要指标:

Prometheus 指标名指标类型含义说明
node_disk_read_bytes_total{device}Counter累计读取字节数
node_disk_written_bytes_total{device}Counter累计写入字节数
node_disk_reads_completed_total{device}Counter累计完成读操作数
node_disk_writes_completed_total{device}Counter累计完成写操作数
node_disk_io_time_seconds_total{device}Counter累计 I/O 耗时
node_disk_io_now{device}Gauge当前在途 I/O 数

常用 PromQL:

# 磁盘读写吞吐(MB/s)
rate(node_disk_read_bytes_total[5m]) / 1024 / 1024
rate(node_disk_written_bytes_total[5m]) / 1024 / 1024

# 磁盘 IOPS
rate(node_disk_reads_completed_total[5m])
rate(node_disk_writes_completed_total[5m])

# 磁盘 I/O 利用率(% 时间在做 I/O)
rate(node_disk_io_time_seconds_total[5m]) * 100

# I/O 延迟
rate(node_disk_read_time_seconds_total[5m]) / rate(node_disk_reads_completed_total[5m])
rate(node_disk_write_time_seconds_total[5m]) / rate(node_disk_writes_completed_total[5m])

# 排除分区设备,只看物理盘
rate(node_disk_read_bytes_total{device=~"sd[a-z]+|nvme[0-9]+n[0-9]+"}[5m])

分析要点:

  • io_time 持续 > 20% 表示 I/O 成为瓶颈
  • 读写延迟 > 10ms 需关注磁盘健康度
  • 关联 CPU iowait 指标交叉验证

4、文件系统指标

Collector: filesystem | 来源: /proc/mounts + statvfs

主要指标:

Prometheus 指标名指标类型含义说明
node_filesystem_size_bytes{device,mountpoint,fstype}Gauge分区总容量
node_filesystem_avail_bytesGauge可用空间
node_filesystem_free_bytesGauge空闲空间(含 root 保留)
node_filesystem_filesGauge总 inode 数
node_filesystem_files_freeGauge空闲 inode 数
node_filesystem_readonlyGauge只读标记(0/1)

常用 PromQL:

# 磁盘使用率(%)
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay|squashfs"} /
     node_filesystem_size_bytes{fstype!~"tmpfs|overlay|squashfs"}) * 100

# inode 使用率(%)
(1 - node_filesystem_files_free{fstype!~"tmpfs|overlay|squashfs"} /
     node_filesystem_files{fstype!~"tmpfs|overlay|squashfs"}) * 100

# 过滤掉伪文件系统(常用排除项)
(node_filesystem_avail_bytes{fstype!~"tmpfs|overlay|squashfs|iso9660"})

# 磁盘空间剩余 GB
node_filesystem_avail_bytes{fstype!~"tmpfs|overlay|squashfs"} / 1024 / 1024 / 1024

# 按增长速率预测磁盘满时间
- deriv(node_filesystem_avail_bytes{mountpoint="/data"}[1h]) * 24

分析要点:

  • 使用率 > 90% 判定严重,需立即处理
  • inode 使用率与空间使用率差异大时需单独关注(小文件过多)
  • 通过增长率预测磁盘满时间,提前预警

5、网络指标

Collector: netdev | 来源: /proc/net/dev

主要指标:

Prometheus 指标名指标类型含义说明
node_network_receive_bytes_total{device}Counter累计接收字节
node_network_transmit_bytes_total{device}Counter累计发送字节
node_network_receive_errs_total{device}Counter接收错误数
node_network_transmit_errs_total{device}Counter发送错误数
node_network_receive_drop_total{device}Counter接收丢包数

常用 PromQL:

# 网络接收吞吐(Bytes/s)
rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*"}[5m])

# 网络发送吞吐(Bytes/s)
rate(node_network_transmit_bytes_total{device!~"lo|veth.*|docker.*"}[5m])

# 网络错误率
rate(node_network_receive_errs_total[5m])

分析要点:

  • 丢包率 > 0.1% 需排查网络设备或网卡问题

6、系统负载

Collector: loadavg | 来源: /proc/loadavg

主要指标:

Prometheus 指标名指标类型含义说明
node_load1Gauge1 分钟平均负载
node_load5Gauge5 分钟平均负载
node_load15Gauge15 分钟平均负载
node_procs_runningGauge运行中进程数
node_procs_blockedGauge阻塞进程数

常用 PromQL:

# 负载与 CPU 核心数比率(>1 表示过载)
node_load1 / count by(instance) (node_cpu_seconds_total{mode="idle"})

# 阻塞进程数(非零说明 I/O 瓶颈)
node_procs_blocked

分析要点:

  • load1 持续 > CPU 核心数 * 1.5 表示过载
  • 对比 load1 / load15 判断是否为突发负载

7、其他指标

1)文件描述符 (filefd collector)

Prometheus 指标名 / 表达式指标类型含义说明备注
node_filefd_allocatedGauge当前系统已分配的文件描述符(FD)数量来自 node-exporter,主机级指标;通常对应 /proc/sys/fs/file-nr 中已分配数量
node_filefd_maximumGauge系统允许的最大文件描述符数量来自 node-exporter,主机级指标;通常对应 /proc/sys/fs/file-max
node_filefd_allocated / node_filefd_maximum * 100Gauge / 百分比文件描述符使用率(FD 使用率)派生表达式,用于衡量当前 FD 消耗占比

2)TCP 连接 (netstat + sockstat collector)

主要指标:

Prometheus 指标名指标类型含义说明备注
node_netstat_Tcp_CurrEstabGauge当前处于 ESTABLISHED 状态的 TCP 连接数反映当前活跃 TCP 连接规模;来自 node-exporter,主机级指标
node_netstat_Tcp_RetransSegsCounterTCP 重传报文段总数用于计算 TCP 重传率;需配合 rate() 使用
node_sockstat_TCP_twGauge处于 TIME_WAIT 状态的 TCP 套接字数过多可能占用本地端口资源;来自 node-exporter,主机级指标
node_sockstat_TCP_inuseGauge正在使用中的 TCP 套接字数表示已分配且未释放的 TCP socket 数量;来自 node-exporter,主机级指标

常用 PromQL:

# TCP 重传速率(高值提示网络质量问题)
rate(node_netstat_Tcp_RetransSegs[5m])

# TIME_WAIT 堆积
node_sockstat_TCP_tw

分析要点:

  • TCP 重传率 > 2% 表明网络质量差
  • 连接数持续增长需检查是否存在连接泄漏

3)系统信息 (boottime + uname + time collector)

主要指标:

Prometheus 指标名指标类型含义说明备注
node_boot_time_secondsGauge系统启动时间(Unix 时间戳,单位:秒)来自 node-exporter,主机级指标
node_time_secondsGauge当前系统时间(Unix 时间戳,单位:秒)来自 node-exporter,用于检测节点时钟偏移
node_uname_infoGauge / Info内核与系统信息,值恒为 1,通过标签携带 sysname、nodename、release、version、machine 等来自 node-exporter;可用标签提取内核版本等信息

常用 PromQL:

# 系统运行时长(秒)
time() - node_boot_time_seconds

# 系统运行时长(天)
(time() - node_boot_time_seconds) / 86400

# 检测节点时钟偏移(秒)
node_time_seconds - time()

# 查看内核版本信息
node_uname_info

# 按内核版本聚合
count by (release, version) (node_uname_info)

三、告警规则参考

#分类告警名称 (alert)级别for触发条件 / 阈值说明
1CPUHostHighCpuLoadwarning5mCPU 使用率 > 70%主机 CPU 使用率过高
2CPUHostCriticalCpuLoadcritical5mCPU 使用率 > 85%主机 CPU 使用率严重,需立即排查
3内存HostMemoryUsageHighwarning5m内存使用率 > 75%主机内存使用率过高
4内存HostMemoryUsageCriticalcritical5m内存使用率 > 90%内存严重不足,存在 OOM 风险
5SwapHostHighSwapUsagewarning3mSwap 使用率 > 80% 且 SwapTotal > 0物理内存不足,存在换页风险
6磁盘HostDiskSpaceWarningwarning5m磁盘使用率 > 80%(排除 tmpfs/overlay/squashfs)磁盘空间不足警告
7磁盘HostDiskSpaceCriticalcritical5m磁盘使用率 > 90%(排除 tmpfs/overlay/squashfs)磁盘空间严重不足,需立即清理
8磁盘 I/OHostDiskIOHighwarning5mI/O 时间占比 > 20%磁盘 I/O 等待过高
9磁盘 I/OHostDiskIOCriticalcritical5mI/O 时间占比 > 40%磁盘 I/O 严重瓶颈
10网络带宽HostNetworkBandwidthHighwarning5m带宽利用率 > 70%(按 1Gbps 网卡)网络带宽利用率过高
11网络带宽HostNetworkBandwidthCriticalcritical5m带宽利用率 > 85%(按 1Gbps 网卡)网络带宽利用率严重
12网络丢包HostNetworkRxPacketLossHighwarning3m接收丢包率 > 0.1% 且接收包数 > 0网卡接收丢包率过高
13网络丢包HostNetworkTxPacketLossHighwarning3m发送丢包率 > 0.1% 且发送包数 > 0网卡发送丢包率过高
14系统负载HostHighLoad1OverCPUCorewarning5mload1 > CPU 核数 × 1.5系统负载过高,可用 load1/load15 判断突发负载
15TCP 连接HostTcpRetransRateHighwarning3mTCP 重传率 > 2% 且报文数 > 0网络质量异常,存在报文丢失
16TCP 连接HostTcpTimeWaitAccumulatewarning5mTIME_WAIT 增速 > 50/s(deriv 10m)TIME_WAIT 持续堆积,疑似连接泄漏

编写 PromQL 时需注意:

Counter vs Gauge: 所有 _total 后缀的指标为 Counter(只增不减),查询时必须使用 rate() 或 increase();无 _total 后缀的指标为 Gauge(可增可减),直接使用即可。

四、小结

至此,我们完整走过了 node_exporter 从定位、安装到指标采集与告警规则落地的全部流程。指标虽多,但不必面面俱到。日常部署的应用主要侧重于 CPU 计算与内存使用,磁盘、网络等指标通常仅在少数特定应用中才需重点关注。因此,在 Grafana 主监控面板中,展示 CPU 与内存使用率即可,其余指标按需在专项面板中查看。