核心是用node_exporter采集主机指标,再通过prometheus拉取存储,最后用promql查询分析;内存需剔除buffers/cached计算真实压力,cpu用idle反推更鲁棒,网络吞吐须区分收发并带速率计算。

监控内存、CPU 和网络吞吐量,核心是用 node_exporter 采集主机指标,再通过 Prometheus 拉取并存储,最后用 PromQL 查询分析。关键不在“能不能”,而在“采得准、算得对、看得清”。
内存使用率:别只看 MemFree
Linux 内存管理复杂,MemFree 不能代表真实可用内存。真正反映压力的是“已用且不可回收”的部分。
- 推荐公式:
(node_memory_MemTotal - node_memory_MemFree - node_memory_Buffers - node_memory_Cached) / node_memory_MemTotal * 100 -
Buffers和Cached属于可回收内存,剔除后更贴近实际压力 - 若启用了 cgroup v2 或容器环境,建议补充
node_memory_Cached{cgroup=~".+"}等维度做隔离分析
CPU 使用率:用 idle 反推更稳定
直接统计 busy 时间易受中断、steal 等干扰,用 idle 倒推更鲁棒。
- 标准写法:
100 - 100 * avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) - 注意
mode="idle"是关键,其他 mode(如 user/system/iowait)可用于细分瓶颈 - 多核场景下,
avg by (instance)自动聚合所有 CPU,避免单核峰值误导整体判断
网络吞吐量:区分收发 + 选对时间窗口
吞吐量不是静态值,必须带速率计算才有意义;同时要区分 inbound/outbound,避免总量掩盖方向性问题。
- 接收速率:
irate(node_network_receive_bytes_total{device=~"eth0|ens33"}[5m]) - 发送速率:
irate(node_network_transmit_bytes_total{device=~"eth0|ens33"}[5m]) - 总吞吐(双向):
irate(node_network_receive_bytes_total[5m]) + irate(node_network_transmit_bytes_total[5m]) - 设备名需按实际调整(
ip link查看),避免匹配 lo 或 docker0 等干扰项
告警与可视化:让指标真正有用
光有指标不够,得让它在该说话时说话、该展示时清晰展示。
- CPU 持续 >80% 超 10 分钟才告警,避免瞬时抖动误报
- 内存使用率 >90% 且
node_memory_Active_anon持续增长,提示可能内存泄漏 - 网络吞吐突增 300% 并伴随
node_network_transmit_errs_total上升,指向网卡或驱动异常 - Grafana 中用 stacked area 图展示各 network device 流量占比,比纯数字更易定位瓶颈接口











