4. 关键资源指标采集:CPU、内存、磁盘、网络等基础指标的采集配置与最佳实践
服务目录的资源优化依赖准确、高频的基础设施指标。CPU、内存、磁盘、网络是四大黄金基础信号,任何一项的采集偏差都会导致容量评估失真、告警延迟或误报。本章从采集配置、关键指标定义、常见陷阱三个维度,给出可直接落地的 Prometheus 采集方案。
4.1 采集架构与指标分类
基础指标采集采用 Node Exporter + 内核接口 的经典模式。Node Exporter 暴露 /metrics 端点,Prometheus 通过服务发现或静态配置抓取。以下 SVG 展示了从操作系统到 Prometheus 的完整采集链路。
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,更真实反映系统可用内存。
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 版本或内核接口兼容性。