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

lxj*_*jhk 9 prometheus

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

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

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

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

Ali*_*ean 12

这里有几件事情需要解开。

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

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

  1. 如果您的分辨率(即步骤)与 Prometheus 的评估间隔不一致(例如分辨率是1m并且评估间隔是13s),您将获得 CPU 使用率的随机抽样,并希望看到接近最高和最低 CPU 使用率的值随着时间的推移在图表上;
  2. 如果您的分辨率与 Prometheus 的评估间隔(例如1m分辨率和15s评估间隔)一致,那么您要么在各处看到基线 CPU 使用率(因为您碰巧看到5s间隔设置为 1 分钟,当没有规则评估发生时)或峰值无处不在的 CPU 使用率(因为您碰巧看到5s间隔 1 分钟,每个间隔都涵盖规则评估)。

关于第二点,对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.01.0) CPU 空闲的时间(在过去一分钟内,分别在最后 2 个样本之间)。

  • 我写了[一篇文章](https://valyala.medium.com/why-irate-from-prometheus-doesnt-capture-spikes-45f9896d7832)解释为什么在大多数情况下不应该使用`irate()`,因为它不捕获尖峰。本文提出了更好的解决方案 - 来自 [MetricsQL](https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL) 的“rollup_rate()”函数 - 用于捕获所有峰值。 (2认同)