为什么在Prometheus中使用irate或rate计算CPU利用率?

时间:2019-04-07 05:58:52

标签: prometheus

我知道CPU利用率是由非空闲时间占CPU总时间的百分比得出的。在Prometheus中,rateirate函数计算向量数组中的变化率。

人们通常通过以下PrmoQL表达式来计算CPU利用率:

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

我不明白计算非空闲时间的每秒变化与计算CPU使用率是如何等效的。有人可以用数学解释为什么这有意义吗?

2 个答案:

答案 0 :(得分:1)

这里有两件事需要解决。

首先,rateirate。链接的问题和博客文章均未解决此问题(但Eitan's answer确实涉及此问题)。区别在于rate估计请求范围内的平均速率(在您的情况下为1分钟),而irate仅根据最后两个样本计算速率。撇开“估计”部分(如果您感到好奇,请参见this answer),两者之间的实际区别在于rate将使结果平滑,而irate将返回对CPU使用率,这更可能显示CPU使用率的极端值,但也更容易出现aliasing

例如如果看一下Prometheus的CPU使用率,您会注意到它处于一个基本恒定的基线,每次评估一个大型规则组时都会出现峰值。给定的时间范围至少与Prometheus的评估间隔一样长,如果您使用rate,则随着时间的推移,CPU使用率或多或少会保持不变(即一条直线)。使用irate(假设刮擦间隔为5s),您将获得以下两点之一:

  1. 如果您的分辨率(即步骤)与Prometheus的评估间隔(例如,分辨率为1m并且评估间隔为13s)不一致,则将获得CPU使用率的随机抽样,并且希望在一段时间内在图表上看到接近最高和最低CPU使用率的值;
  2. 如果您的分辨率与Prometheus的评估间隔(例如1m分辨率和15s评估间隔)一致,那么您会在任何地方看到基准CPU使用率(因为您碰巧看到了{{ 1}}间隔设置为每隔1分钟(当没有规则评估发生时)或峰值CPU使用率(因为您碰巧看到间隔每隔1分钟的5s个间隔,每一次覆盖规则评估)。

关于第二点,对于5s指标所表示的明显混淆是counter。这意味着它是一个连续递增的数字,从根本上衡量了自出口商启动以来CPU处于空闲状态的时间。绝对值并没有那么有用(因为它取决于导出器启动的时间,并且每次重新启动时都会降至0)。有趣的是,它在一段时间内增加了多少:您可以在给定的时间内计算每秒的增长率(node_cpu_seconds_total的平均值; {{1}的瞬时值) }或绝对增加(使用rate)。因此,irateincrease都将为您提供一个比率(在rate(node_cpu_seconds_total{mode="idle"}[1m])irate(node_cpu_seconds_total{mode="idle"}[1m])之间)(CPU空闲)(过去一分钟以及最后一分钟之间) 2个样本)。

答案 1 :(得分:0)

看起来已经在这里得到了回答:Prometheus - Convert cpu_user_seconds to CPU Usage %? 查看答案中提供的链接:https://www.robustperception.io/understanding-machine-cpu-usage,可以看到说明。 就个人而言,我认为在这种情况下进行评估更有意义,因为它将向您显示最后一个活动点的平均值(与之相对的是将整个采样时隙平均的比率)。