我知道CPU利用率是由非空闲时间占CPU总时间的百分比得出的。在Prometheus中,rate
或irate
函数计算向量数组中的变化率。
人们通常通过以下PrmoQL表达式来计算CPU利用率:
(100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100))
我不明白计算非空闲时间的每秒变化与计算CPU使用率是如何等效的。有人可以用数学解释为什么这有意义吗?
答案 0 :(得分:1)
这里有两件事需要解决。
首先,rate
对irate
。链接的问题和博客文章均未解决此问题(但Eitan's answer确实涉及此问题)。区别在于rate
估计请求范围内的平均速率(在您的情况下为1分钟),而irate
仅根据最后两个样本计算速率。撇开“估计”部分(如果您感到好奇,请参见this answer),两者之间的实际区别在于rate
将使结果平滑,而irate
将返回对CPU使用率,这更可能显示CPU使用率的极端值,但也更容易出现aliasing。
例如如果看一下Prometheus的CPU使用率,您会注意到它处于一个基本恒定的基线,每次评估一个大型规则组时都会出现峰值。给定的时间范围至少与Prometheus的评估间隔一样长,如果您使用rate
,则随着时间的推移,CPU使用率或多或少会保持不变(即一条直线)。使用irate
(假设刮擦间隔为5s
),您将获得以下两点之一:
1m
并且评估间隔为13s
)不一致,则将获得CPU使用率的随机抽样,并且希望在一段时间内在图表上看到接近最高和最低CPU使用率的值; 1m
分辨率和15s
评估间隔)一致,那么您会在任何地方看到基准CPU使用率(因为您碰巧看到了{{ 1}}间隔设置为每隔1分钟(当没有规则评估发生时)或峰值CPU使用率(因为您碰巧看到间隔每隔1分钟的5s
个间隔,每一次覆盖规则评估)。
关于第二点,对于5s
指标所表示的明显混淆是counter。这意味着它是一个连续递增的数字,从根本上衡量了自出口商启动以来CPU处于空闲状态的时间。绝对值并没有那么有用(因为它取决于导出器启动的时间,并且每次重新启动时都会降至0)。有趣的是,它在一段时间内增加了多少:您可以在给定的时间内计算每秒的增长率(node_cpu_seconds_total
的平均值; {{1}的瞬时值) }或绝对增加(使用rate
)。因此,irate
和increase
都将为您提供一个比率(在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,可以看到说明。 就个人而言,我认为在这种情况下进行评估更有意义,因为它将向您显示最后一个活动点的平均值(与之相对的是将整个采样时隙平均的比率)。