了解 CPU Busy Prometheus 查询

Understanding the CPU Busy Prometheus query

我是 Grafana 和 Prometheus 的新手。我已经阅读了很多文档,现在我正在尝试通过查看一些现有查询并确保我理解它们来向后工作

我已经下载了 Node Exporter 完整仪表板 (https://grafana.com/grafana/dashboards/1860)。我一直在审查 CPU 繁忙的查询,我有点困惑。我在下面引用它,间隔开以便我们可以更好地看到嵌套部分:

在这个查询中,jobnode-exporter,而instance是服务器的IP和端口。这是我对查询的基本理解: node_cpu_seconds_total 是 CPU 在给定样本上所用秒数的计数器。

  1. 第 5 行:在给定时刻获取 cpu 秒,按单个 CPU 核心进行细分
  2. 第 4 行:将所有核心的所有 CPU 秒加起来
  3. 第 3 行:为什么要多一个 count()?它有什么作用吗?
  4. 第 12 行:速率向量 - 获取 cpu 秒的时间 cpu 在给定的速率周期内处于空闲状态
  5. 第 11 行:采用速率将其转换为 cpu 秒的变化率(和 return 瞬时矢量)
  6. 第 10 行:汇总所有费率,按 CPU 模式细分
  7. 第 9 行:取所有 CPU 模式速率的单个平均速率
  8. 第 8 行:从总 CPU 秒(第 3 行)中减去平均变化率(第 9 行)
  9. 第 16 行:乘以 100 将分钟转换为秒 10:第 18-20 行:将第 19 行除以所有 CPU 秒的计数 CPUs

我的问题如下:

这两个计数功能 return CPU 个内核的数量。如果您将它们从这个长查询中取出并执行,它会立即有意义:

count by (cpu) (node_cpu_seconds_total{instance="foo:9100"})

# result:
{cpu="0"} 8
{cpu="1"} 8

通过将以上内容放入另一个 count() 函数中,您将获得 2 的值,因为数据集中只有 2 个指标。此时,我们可以将原来的查询简化为:

(
  NUM_CPU
  -
  avg(
    sum by(mode) (
      rate(node_cpu_seconds_total{mode="idle",instance="foo:9100"}[1m])
    )
  )
  * 100
)
/ NUM_CPU

然而,剩下的有点复杂。这个:

    sum by(mode) (
      rate(node_cpu_seconds_total{mode="idle",instance="foo:9100"}[1m])
    )

... 本质上是 所有 CPU 核心的空闲时间总和 (我故意跳过时间上下文使其更简单)。不清楚为什么会有by (mode),因为里面的rate function有一个filter,所以可能只有idle模式出现。有或没有 by (mode) 它 return 只是一个值:

# with by (mode)
{mode="idle"} 0.99

# without
{} 0.99

avg() 最重要的是没有任何意义。 我假设,目的是获得空闲时间每CPU (即by (cpu))。在这种情况下,它开始有意义,尽管它仍然是不必要的复杂。因此,此时我们可以将查询简化为:

(NUM_CPU - IDLE_TIME_TOTAL * 100) / NUM_CPU

我不知道为什么这么复杂,你可以用这样一个简单的查询得到相同的结果:

100 * (1 - avg(rate(node_cpu_seconds_total{mode="idle", instance="foo:9100"}[1m])))