为什么在普罗米修斯中使用愤怒或速率计算 CPU 利用率?



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

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

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

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

这里有几件事需要解开。

首先,ratevsirate.链接的问题和博客文章都没有解决这个问题(但Eitan的回答确实触及了这个问题)。不同之处在于,rate估计请求范围内(在您的情况下为 1 分钟)内的平均速率,而irate仅根据最后 2 个样本计算速率。撇开"估计"部分(如果你好奇,请参阅这个答案),两者之间的实际区别在于rate将平滑结果,而irate将返回 CPU 使用率的样本,这更有可能显示 CPU 使用率的极端值,但也更容易出现混叠。

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

  1. 如果您的分辨率(即步长)与 Prometheus 的评估间隔不一致(例如,分辨率1m且评估间隔13s),您将获得 CPU 使用率的随机抽样,并希望在图表上看到接近一段时间内最高和最低 CPU 使用率的值;
  2. 如果您的分辨率与普罗米修斯的评估间隔一致(例如1m分辨率和15s评估间隔),然后,您会看到所有位置的基线 CPU 使用率(因为您碰巧查看了相隔 1 分钟的间隔5s,当没有规则评估发生时)或到处都可以看到峰值 CPU 使用率(因为您碰巧查看相隔 1 分钟的5s间隔,每个间隔都涵盖一个规则评估)。

关于第二点,对node_cpu_seconds_total指标代表什么的明显混淆,它是一个计数器。这意味着它是一个连续递增的数字,本质上是衡量自导出器启动以来 CPU 空闲的时间量。绝对值并不是那么有用(因为它取决于导出器何时启动,并且在每次重新启动时都会下降到 0)。有趣的是它在一段时间内增加了多少:从中你可以计算出给定时间段的每秒增长率(平均,rate;即时,irate)或绝对增加(increase)。因此,rate(node_cpu_seconds_total{mode="idle"}[1m])irate(node_cpu_seconds_total{mode="idle"}[1m])都会为您提供 CPU 空闲程度的比率(0.01.0之间)(过去一分钟,以及最后 2 个样本之间

)。

看起来这里已经回答了这个问题: 普罗米修斯 - 将cpu_user_seconds转换为 CPU 使用率 %? 查看答案中提供的链接:https://www.robustperception.io/understanding-machine-cpu-usage 您可以看到解释。 就个人而言,我认为在这种情况下愤怒更有意义,因为它会向您显示最后一个活动点的平均值(相对于将平均整个采样时间段的速率)。

最新更新