Prometheus 怎么把 CPU 秒数(cpu_seconds_total)换算成使用率百分比?

Prometheus 计数器换算 CPU 使用率:rate() 求每秒增量即核数,×100 得百分比;node_cpu_seconds_total 与容器 container_cpu_usage_seconds_total 的完整 PromQL 示例与 FAQ。

最佳实践
Prometheus 怎么把 CPU 秒数(cpu_seconds_total)换算成使用率百分比?封面

核心思路:CPU 秒数是累计计数器**(counter),用 rate() 求每秒增量——结果直接就是"占用了几个核",乘 100 就是百分比。** 每秒消耗 1 秒 CPU = 占满 1 个核。

主机 CPU(node_exporter)

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

# 只看用户态(user)使用率
avg by (instance) (rate(node_cpu_seconds_total{mode="user"}[5m])) * 100

拆解 rate(node_cpu_seconds_total{mode="idle"}[5m])

  • node_cpu_seconds_totalmode(idle/user/system/iowait…)分标签累计 CPU 时间;
  • rate(...[5m]) 计算 5 分钟窗口内每秒增量 → idle 模式平均每秒"空闲"几核;
  • avg by (instance) 把各核合并;1 - idle 占比 = 使用率。

容器 CPU(cAdvisor/kubelet)

# 每个容器的 CPU 使用核数
rate(container_cpu_usage_seconds_total{container!=""}[5m])

# 换算成占其 limit 的百分比(K8s 场景更实用)
rate(container_cpu_usage_seconds_total{container!=""}[5m])
/
on (namespace, pod, container) group_left
container_spec_cpu_quota{container!=""} / 100000
* 100

要点:container_spec_cpu_quota 单位是微核周期的配额,除以 100000 得到核数,做除法即得相对 limit 的百分比。

换算直觉检查

rate(...) 结果是 0.5 意味着:平均每秒钟消耗了 0.5 秒的 CPU——即半个核,50% 的单核使用率。双核机器上 0.5 核 = 整机的 25%,这就是"要不要除以核数"取决于你问的是"几核"还是"整机的百分之几"。

观测云对照

如果不想手写 PromQL,观测云把主机和容器的 CPU 指标采集后开箱即用——主机视图直接展示 user/system/iowait 分解与使用率曲线,容器视图按 Pod/容器粒度展示用量与 limit 占比,配监控器对"CPU 使用率 > 85% 持续 5 分钟"这类条件告警,从查数到告警不用碰一行查询语句。

常见问题(FAQ)

Q:rate 和 irate 选哪个?
A:看趋势用 rate[5m](平滑);抓瞬时尖刺用 irate(只看最后两个点)。告警条件一般用 rate,避免毛刺误报。

Q:为什么算出来超过 100%?
A:多核叠加——进程用了 2 核,rate 结果就是 2,×100 是 200%。要归一化到整机百分比就除以核数(或直接用 1 - idle 的算法,天然在 0-100 内)。

Q:计数器重启清零会影响结果吗?
A:不会,rate() 自动处理 counter reset——这正是必须用它而不是手动算差值的原因。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台