PromQL 正确获取 CPU 使用百分比

Posted

技术标签:

【中文标题】PromQL 正确获取 CPU 使用百分比【英文标题】:PromQL to correctly get CPU usage percentage 【发布时间】:2020-04-27 05:45:48 【问题描述】:

我很难理解有关 cAdvisor 指标(被 Prometheus 抓取时)特别是 cpu 使用指标的一些概念。

它提供了以下三种有关 CPU 使用率的指标类型:

container_cpu_system_seconds_total:累计系统cpu时间 consumed container_cpu_user_seconds_total:累计用户cpu时间 consumed container_cpu_usage:累计使用cpu时间消耗

当我计算它们的速率时,我想得到相应 CPU 的百分比 (* 100)。例如使用以下 PromQL:

sum by (pod) (container_cpu_usage_seconds_total)

但是,cpu_user 和 cpu_system 百分比值的总和不等于 cpu_usage 的百分比值。如果这是预期的差异,这种差异代表什么?

【问题讨论】:

【参考方案1】:

我不知道 cAdvisor 究竟是如何工作的,但与 Node_Exporter 的工作方式类似,我认为除了“用户”和“系统”之外还有更多的 CPU 模式可以加起来总 CPU 使用率。

查看所有可用的 Node_Exporter CPU 模式:

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_totalcpu="0",mode="idle" 5.96744154e+06
node_cpu_seconds_totalcpu="0",mode="iowait" 6523.35
node_cpu_seconds_totalcpu="0",mode="irq" 0
node_cpu_seconds_totalcpu="0",mode="nice" 936.5
node_cpu_seconds_totalcpu="0",mode="softirq" 8087.39
node_cpu_seconds_totalcpu="0",mode="steal" 21.29
node_cpu_seconds_totalcpu="0",mode="system" 33360.63
node_cpu_seconds_totalcpu="0",mode="user" 862602.25

【讨论】:

【参考方案2】:

*_total 指标求和是不正确的 - 您应该将rate 应用于它们,然后对结果求和:

sum by (pod) (rate(container_cpu_usage_seconds_total[5m]))

此查询应返回过去 5 分钟内每个 pod 使用的 CPU 内核数。

见this blog post explaining why sum(rate()) should be used instead of rate(sum())

【讨论】:

以上是关于PromQL 正确获取 CPU 使用百分比的主要内容,如果未能解决你的问题,请参考以下文章

使用 promql 获取结果总数或高于阈值的百分比

获取总 CPU 使用率的百分比

获取与 powershell 计数器一起使用的 cpu 百分比

以百分比形式获取 Docker 容器 CPU 使用率

Grafana 中显示的 netdata 指标显示不正确的值

top和ps aux得到cpu使用率的区别