我知道CPU利用率是由非空闲时间占CPU总时间的百分比给出的。在普罗米修斯,rate
或irate
函数计算向量数组中的变化率。
人们通常通过以下PrmoQL表达式计算CPU利用率:
(100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100))
我不明白如何计算每秒非空闲时间的变化相当于计算CPU使用率。有人可以用数学方式解释为什么这有意义吗?
这里有几件要解开的东西。
首先,rate
vs irate
。链接的问题和博客文章都没有解决这个问题(但Eitan's answer确实触及了它)。区别在于rate
估计所要求范围内的平均速率(在您的情况下为1分钟),而irate
仅根据最后2个样本计算速率。暂且不谈“估计”部分(如果你很好奇,请参阅this answer)2之间的实际差异是rate
将平滑结果,而irate
将返回CPU使用的样本,这更可能显示CPU的极端情况使用但也更容易发生aliasing。
例如。如果你看一下普罗米修斯的CPU使用情况,你会发现它处于一个有点恒定的基线,每次评估一个大型规则组时都会出现峰值。给定时间范围至少与普罗米修斯的评估间隔一样长,如果你使用rate
,你会得到一个或多或少恒定的CPU使用率(即一条平线)。使用irate
(假设5s
的刮擦间隔)你会得到以下两件事之一:
1m
且评估间隔为13s
),您将获得CPU使用率的随机抽样,并希望看到接近最高和最低值的值图表上的CPU使用率随时间变化;1m
分辨率和15s
评估间隔)一致,那么您可以在任何地方看到基线CPU使用情况(因为您碰巧看到相隔1分钟的5s
间隔,当没有规则评估发生时)或者到处都是峰值CPU使用率(因为你碰巧看到相隔1分钟的5s
间隔,每个间隔覆盖规则评估)。关于第二点,对于node_cpu_seconds_total
度量表示的明显混淆,它是一个counter。这意味着它是一个连续递增的数字,基本上衡量自出口商启动以来CPU空闲的时间。绝对值并非完全有用(因为它取决于导出器何时启动,并且每次重新启动时将降至0)。有趣的是它在一段时间内增加了多少:从那个你可以计算出一定时间内每秒的增长率(平均值,rate
;瞬间,irate
)或绝对增加(用increase
)。所以rate(node_cpu_seconds_total{mode="idle"}[1m])
和irate(node_cpu_seconds_total{mode="idle"}[1m])
都会给你一个比率(在0.0
和1.0
之间),CPU的空闲程度(过去一分钟,最后两个样本之间)。
看起来这里已经回答:Prometheus - Convert cpu_user_seconds to CPU Usage %?查看答案中提供的链接:https://www.robustperception.io/understanding-machine-cpu-usage你可以看到解释。就个人而言,我认为在这种情况下愤怒更有意义,因为它会显示最后活动点的平均值(与整个采样时间段的平均值相比)。