从传统物理机、虚拟机到云原生环境,基础设施的形态在变,但主机层的基础指标始终是性能分析与稳定性排查的基石。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、二进制文件安装
$ 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_total | Counter | CPU 花费在不同模式(如 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,手动调低进程优先级才会上涨。 |
| iowait | IO 等待 | 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_bytes | Gauge | 物理内存总量 |
node_memory_MemAvailable_bytes | Gauge | 可用内存(含可回收缓存) |
node_memory_MemFree_bytes | Gauge | 完全空闲内存 |
node_memory_Buffers_bytes | Gauge | 内核缓冲区 |
node_memory_Cached_bytes | Gauge | 页面缓存 |
node_memory_SwapTotal_bytes | Gauge | Swap 总量 |
node_memory_SwapFree_bytes | Gauge | Swap 空闲 |
常用 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_bytes | Gauge | 可用空间 |
node_filesystem_free_bytes | Gauge | 空闲空间(含 root 保留) |
node_filesystem_files | Gauge | 总 inode 数 |
node_filesystem_files_free | Gauge | 空闲 inode 数 |
node_filesystem_readonly | Gauge | 只读标记(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_load1 | Gauge | 1 分钟平均负载 |
node_load5 | Gauge | 5 分钟平均负载 |
node_load15 | Gauge | 15 分钟平均负载 |
node_procs_running | Gauge | 运行中进程数 |
node_procs_blocked | Gauge | 阻塞进程数 |
常用 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_allocated | Gauge | 当前系统已分配的文件描述符(FD)数量 | 来自 node-exporter,主机级指标;通常对应 /proc/sys/fs/file-nr 中已分配数量 |
node_filefd_maximum | Gauge | 系统允许的最大文件描述符数量 | 来自 node-exporter,主机级指标;通常对应 /proc/sys/fs/file-max |
node_filefd_allocated / node_filefd_maximum * 100 | Gauge / 百分比 | 文件描述符使用率(FD 使用率) | 派生表达式,用于衡量当前 FD 消耗占比 |
2)TCP 连接 (netstat + sockstat collector)
主要指标:
| Prometheus 指标名 | 指标类型 | 含义说明 | 备注 |
|---|---|---|---|
node_netstat_Tcp_CurrEstab | Gauge | 当前处于 ESTABLISHED 状态的 TCP 连接数 | 反映当前活跃 TCP 连接规模;来自 node-exporter,主机级指标 |
node_netstat_Tcp_RetransSegs | Counter | TCP 重传报文段总数 | 用于计算 TCP 重传率;需配合 rate() 使用 |
node_sockstat_TCP_tw | Gauge | 处于 TIME_WAIT 状态的 TCP 套接字数 | 过多可能占用本地端口资源;来自 node-exporter,主机级指标 |
node_sockstat_TCP_inuse | Gauge | 正在使用中的 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_seconds | Gauge | 系统启动时间(Unix 时间戳,单位:秒) | 来自 node-exporter,主机级指标 |
node_time_seconds | Gauge | 当前系统时间(Unix 时间戳,单位:秒) | 来自 node-exporter,用于检测节点时钟偏移 |
node_uname_info | Gauge / 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 | 触发条件 / 阈值 | 说明 | |
|---|---|---|---|---|---|---|---|
| 1 | CPU | HostHighCpuLoad | warning | 5m | CPU 使用率 > 70% | 主机 CPU 使用率过高 | |
| 2 | CPU | HostCriticalCpuLoad | critical | 5m | CPU 使用率 > 85% | 主机 CPU 使用率严重,需立即排查 | |
| 3 | 内存 | HostMemoryUsageHigh | warning | 5m | 内存使用率 > 75% | 主机内存使用率过高 | |
| 4 | 内存 | HostMemoryUsageCritical | critical | 5m | 内存使用率 > 90% | 内存严重不足,存在 OOM 风险 | |
| 5 | Swap | HostHighSwapUsage | warning | 3m | Swap 使用率 > 80% 且 SwapTotal > 0 | 物理内存不足,存在换页风险 | |
| 6 | 磁盘 | HostDiskSpaceWarning | warning | 5m | 磁盘使用率 > 80%(排除 tmpfs/overlay/squashfs) | 磁盘空间不足警告 | |
| 7 | 磁盘 | HostDiskSpaceCritical | critical | 5m | 磁盘使用率 > 90%(排除 tmpfs/overlay/squashfs) | 磁盘空间严重不足,需立即清理 | |
| 8 | 磁盘 I/O | HostDiskIOHigh | warning | 5m | I/O 时间占比 > 20% | 磁盘 I/O 等待过高 | |
| 9 | 磁盘 I/O | HostDiskIOCritical | critical | 5m | I/O 时间占比 > 40% | 磁盘 I/O 严重瓶颈 | |
| 10 | 网络带宽 | HostNetworkBandwidthHigh | warning | 5m | 带宽利用率 > 70%(按 1Gbps 网卡) | 网络带宽利用率过高 | |
| 11 | 网络带宽 | HostNetworkBandwidthCritical | critical | 5m | 带宽利用率 > 85%(按 1Gbps 网卡) | 网络带宽利用率严重 | |
| 12 | 网络丢包 | HostNetworkRxPacketLossHigh | warning | 3m | 接收丢包率 > 0.1% 且接收包数 > 0 | 网卡接收丢包率过高 | |
| 13 | 网络丢包 | HostNetworkTxPacketLossHigh | warning | 3m | 发送丢包率 > 0.1% 且发送包数 > 0 | 网卡发送丢包率过高 | |
| 14 | 系统负载 | HostHighLoad1OverCPUCore | warning | 5m | load1 > CPU 核数 × 1.5 | 系统负载过高,可用 load1/load15 判断突发负载 | |
| 15 | TCP 连接 | HostTcpRetransRateHigh | warning | 3m | TCP 重传率 > 2% 且报文数 > 0 | 网络质量异常,存在报文丢失 | |
| 16 | TCP 连接 | HostTcpTimeWaitAccumulate | warning | 5m | TIME_WAIT 增速 > 50/s(deriv 10m) | TIME_WAIT 持续堆积,疑似连接泄漏 |
编写 PromQL 时需注意:
Counter vs Gauge: 所有
_total后缀的指标为 Counter(只增不减),查询时必须使用rate()或increase();无_total后缀的指标为 Gauge(可增可减),直接使用即可。
四、小结
至此,我们完整走过了 node_exporter 从定位、安装到指标采集与告警规则落地的全部流程。指标虽多,但不必面面俱到。日常部署的应用主要侧重于 CPU 计算与内存使用,磁盘、网络等指标通常仅在少数特定应用中才需重点关注。因此,在 Grafana 主监控面板中,展示 CPU 与内存使用率即可,其余指标按需在专项面板中查看。