我知道 CPU 利用率是由非空闲时间占 CPU 总时间的百分比给出的。在普罗米修斯中,rate
或irate
函数计算向量数组中的变化率。
人们通常通过以下 PromQL 表达式来计算 CPU 利用率:
(100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100))
我不明白计算非空闲时间的每秒变化如何等同于计算 CPU 使用率。有人能用数学解释为什么这是有意义的吗?
这里有几件事需要解开。
首先,rate
vsirate
.链接的问题和博客文章都没有解决这个问题(但Eitan的回答确实触及了这个问题)。不同之处在于,rate
估计请求范围内(在您的情况下为 1 分钟)内的平均速率,而irate
仅根据最后 2 个样本计算速率。撇开"估计"部分(如果你好奇,请参阅这个答案),两者之间的实际区别在于rate
将平滑结果,而irate
将返回 CPU 使用率的样本,这更有可能显示 CPU 使用率的极端值,但也更容易出现混叠。
例如,如果您查看 Prometheus 的 CPU 使用率,您会注意到它处于一个恒定的基线,每次评估大型规则组时都会出现峰值。给定一个至少与普罗米修斯的评估间隔一样长的时间范围,如果你使用rate
随着时间的推移,你会得到或多或少恒定的 CPU 使用率(即一条平线)。使用irate
(假设刮擦间隔为5s
),您将获得以下 2 件事之一:
- 如果您的分辨率(即步长)与 Prometheus 的评估间隔不一致(例如,分辨率
1m
且评估间隔13s
),您将获得 CPU 使用率的随机抽样,并希望在图表上看到接近一段时间内最高和最低 CPU 使用率的值; - 如果您的分辨率与普罗米修斯的评估间隔一致(例如
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.0
和1.0
之间)(过去一分钟,以及最后 2 个样本之间
看起来这里已经回答了这个问题: 普罗米修斯 - 将cpu_user_seconds转换为 CPU 使用率 %? 查看答案中提供的链接:https://www.robustperception.io/understanding-machine-cpu-usage 您可以看到解释。 就个人而言,我认为在这种情况下愤怒更有意义,因为它会向您显示最后一个活动点的平均值(相对于将平均整个采样时间段的速率)。