4. 关键资源指标采集:CPU、内存、磁盘、网络等基础指标的采集配置与最佳实践

服务目录的资源优化依赖准确、高频的基础设施指标。CPU、内存、磁盘、网络是四大黄金基础信号,任何一项的采集偏差都会导致容量评估失真、告警延迟或误报。本章从采集配置、关键指标定义、常见陷阱三个维度,给出可直接落地的 Prometheus 采集方案。

4.1 采集架构与指标分类

基础指标采集采用 Node Exporter + 内核接口 的经典模式。Node Exporter 暴露 /metrics 端点,Prometheus 通过服务发现或静态配置抓取。以下 SVG 展示了从操作系统到 Prometheus 的完整采集链路。

基础指标采集链路架构 操作系统 /proc /sys Node Exporter :9100/metrics Prometheus 抓取 + 存储 服务目录 资源视图 采集配置示例 scrape_interval: 15s metrics_path: /metrics
采集原则:所有基础指标统一由 Node Exporter 暴露,避免在目标主机上部署多个 exporter。Node Exporter 默认开启的采集器已覆盖 CPU、内存、磁盘、网络四大类,无需额外安装插件。

4.2 CPU 指标采集与关键公式

CPU 指标反映计算资源饱和度。Node Exporter 通过读取 /proc/stat 暴露以下核心指标:

指标名称 类型 标签说明 采集来源
node_cpu_seconds_total Counter mode=user/system/idle/iowait /proc/stat
node_load1 Gauge 无 /proc/loadavg
node_context_switches_total Counter 无 /proc/stat

CPU 使用率计算(推荐公式):

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

该公式使用 rate() 计算每秒空闲 CPU 时间的增量,再用 100 减去得到使用率。避免使用 irate(),因为 irate() 对短时间抖动敏感,不适合容量规划场景。

常见陷阱:不要直接对 node_cpu_seconds_total 做 avg 聚合。必须先用 rate() 转换为每秒速率,再聚合。直接聚合 Counter 原始值会得到从系统启动到现在的累积时间,毫无意义。

4.3 内存指标采集与 OOM 风险识别

内存指标用于判断物理内存、交换分区和缓存的使用水位。Node Exporter 从 /proc/meminfo 采集以下关键指标:

指标名称 类型 含义 告警阈值参考
node_memory_MemTotal_bytes Gauge 物理内存总量 —
node_memory_MemAvailable_bytes Gauge 可用内存(含缓存可回收部分) < 10% 总量
node_memory_SwapTotal_bytes Gauge 交换分区总量 —
node_memory_SwapFree_bytes Gauge 交换分区剩余 < 20% 总量

内存使用率计算(推荐公式):

(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

使用 MemAvailable 而非 MemFree,因为 MemAvailable 包含了可回收的 page cache 和 slab,更真实反映系统可用内存。

OOM 风险指标:当 node_memory_MemAvailable_bytes 持续低于 5% 且 node_memory_SwapFree_bytes 快速下降时,OOM Killer 被触发的概率急剧上升。建议设置 node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.05 为 P0 告警。

4.4 磁盘指标采集与 IO 瓶颈分析

磁盘指标分为空间使用率和 IO 性能两个维度。Node Exporter 通过 filesystem 和 diskstats 采集器分别暴露。

4.4.1 磁盘空间指标

指标名称 类型 标签 说明
node_filesystem_size_bytes Gauge device, mountpoint, fstype 分区总大小
node_filesystem_avail_bytes Gauge device, mountpoint, fstype 非 root 用户可用空间
node_filesystem_files Gauge device, mountpoint, fstype inode 总数

磁盘使用率计算:

(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100

过滤 tmpfs 和 overlay 文件系统,避免容器临时挂载点干扰容量告警。

4.4.2 磁盘 IO 性能指标

指标名称 类型 含义 瓶颈判断
node_disk_io_time_seconds_total Counter 磁盘 IO 耗时累计 rate() > 0.8 表示高负载
node_disk_read_bytes_total Counter 读取字节累计 与磁盘带宽上限对比
node_disk_written_bytes_total Counter 写入字节累计 与磁盘带宽上限对比
node_disk_io_now Gauge 当前正在处理的 IO 请求数 持续 > 磁盘队列深度

IO 使用率计算(磁盘饱和度):

rate(node_disk_io_time_seconds_total[5m])

该值接近 1.0 表示磁盘接近 100% 繁忙,是 IO 瓶颈的直接证据。

4.5 网络指标采集与带宽监控

网络指标用于识别流量异常、带宽饱和和丢包。Node Exporter 从 /proc/net/dev 采集每个网络接口的统计信息。

指标名称 类型 标签 典型用途
node_network_receive_bytes_total Counter device 入站流量速率
node_network_transmit_bytes_total Counter device 出站流量速率
node_network_receive_drop_total Counter device 入站丢包计数
node_network_transmit_drop_total Counter device 出站丢包计数
node_network_receive_errors_total Counter device 入站错误计数

网络带宽使用率计算:

rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*"}[5m]) * 8

乘以 8 将字节转换为比特,与网卡带宽(bps)对比。过滤 loopback、veth 和 docker 接口,只监控物理网卡。

丢包与错误区分:_drop_total 表示缓冲区满导致的数据包丢弃,通常指示带宽不足或突发流量;_errors_total 表示物理层错误(如 CRC 校验失败),通常指示网卡或线缆故障。两者需要不同的处理策略。

4.6 采集配置最佳实践清单

以下清单汇总了生产环境中基础指标采集的关键配置项:

  • 抓取间隔:基础指标设为 15s,CPU/内存/磁盘/网络变化相对平缓,15s 足够捕捉 95% 的容量变化。
  • 指标过滤:在 Prometheus 的 scrape_config 中使用 metric_relabel_configs 丢弃不需要的高基数标签(如 device 中的 loopback 接口),减少存储开销。
  • Node Exporter 版本:始终使用最新稳定版,旧版本存在 node_filesystem_avail_bytes 计算偏差问题。
  • 采集器启用:默认采集器已包含所有基础指标,无需额外启用。如需禁用某些采集器(如 --no-collector.arp),在 Node Exporter 启动参数中配置。
  • 安全加固:Node Exporter 绑定 --web.listen-address=:9100 并配合网络策略限制访问来源,避免指标端点暴露到公网。

4.7 指标采集质量验证

部署完成后,通过以下 PromQL 快速验证采集是否正常:

# 检查 Node Exporter 是否在线
up{job="node-exporter"}

# 检查指标新鲜度(最近一次采集时间戳)
time() - node_boot_time_seconds < 300

# 检查指标值合理性(CPU 使用率应在 0-100 之间)
clamp_max(100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100), 100)

如果 up 指标为 0,说明 Prometheus 无法连接到 Node Exporter;如果指标值出现负数或超过物理上限,检查 Node Exporter 版本或内核接口兼容性。