了解 CPU Busy Prometheus 查询
Understanding the CPU Busy Prometheus query
我是 Grafana 和 Prometheus 的新手。我已经阅读了很多文档,现在我正在尝试通过查看一些现有查询并确保我理解它们来向后工作
我已经下载了 Node Exporter 完整仪表板 (https://grafana.com/grafana/dashboards/1860)。我一直在审查 CPU 繁忙的查询,我有点困惑。我在下面引用它,间隔开以便我们可以更好地看到嵌套部分:
在这个查询中,job
是node-exporter
,而instance
是服务器的IP和端口。这是我对查询的基本理解:
node_cpu_seconds_total
是 CPU 在给定样本上所用秒数的计数器。
- 第 5 行:在给定时刻获取 cpu 秒,按单个 CPU 核心进行细分
- 第 4 行:将所有核心的所有 CPU 秒加起来
- 第 3 行:为什么要多一个 count()?它有什么作用吗?
- 第 12 行:速率向量 - 获取 cpu 秒的时间 cpu 在给定的速率周期内处于空闲状态
- 第 11 行:采用速率将其转换为 cpu 秒的变化率(和 return 瞬时矢量)
- 第 10 行:汇总所有费率,按 CPU 模式细分
- 第 9 行:取所有 CPU 模式速率的单个平均速率
- 第 8 行:从总 CPU 秒(第 3 行)中减去平均变化率(第 9 行)
- 第 16 行:乘以 100 将分钟转换为秒
10:第 18-20 行:将第 19 行除以所有 CPU 秒的计数 CPUs
我的问题如下:
- 我原以为 CPU 使用率只是(所有非闲置 cpu 使用率)/(总 cpu 使用率)。因此我不明白为什么要考虑利率(#6 和#8)
- 这里的分子似乎是在尝试获取所有非空闲使用情况,并通过获取全部总和并减去空闲时间来实现。但是为什么一个用count,一个用sum呢?
- 如果我们通过
mode=idle
过滤来抓取 cpu 秒,那么添加 by (mode)
会增加什么吗?反正只有一种模式?当有多个值时,我对 by (something)
的理解更为相关,我们按该类别对值进行分组(正如我们在此查询中按 cpu
所做的那样)
- 最后,如上粗体所示,分子和分母中的double count()是什么意思?
这两个计数功能 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])))
我是 Grafana 和 Prometheus 的新手。我已经阅读了很多文档,现在我正在尝试通过查看一些现有查询并确保我理解它们来向后工作
我已经下载了 Node Exporter 完整仪表板 (https://grafana.com/grafana/dashboards/1860)。我一直在审查 CPU 繁忙的查询,我有点困惑。我在下面引用它,间隔开以便我们可以更好地看到嵌套部分:
在这个查询中,job
是node-exporter
,而instance
是服务器的IP和端口。这是我对查询的基本理解:
node_cpu_seconds_total
是 CPU 在给定样本上所用秒数的计数器。
- 第 5 行:在给定时刻获取 cpu 秒,按单个 CPU 核心进行细分
- 第 4 行:将所有核心的所有 CPU 秒加起来
- 第 3 行:为什么要多一个 count()?它有什么作用吗?
- 第 12 行:速率向量 - 获取 cpu 秒的时间 cpu 在给定的速率周期内处于空闲状态
- 第 11 行:采用速率将其转换为 cpu 秒的变化率(和 return 瞬时矢量)
- 第 10 行:汇总所有费率,按 CPU 模式细分
- 第 9 行:取所有 CPU 模式速率的单个平均速率
- 第 8 行:从总 CPU 秒(第 3 行)中减去平均变化率(第 9 行)
- 第 16 行:乘以 100 将分钟转换为秒 10:第 18-20 行:将第 19 行除以所有 CPU 秒的计数 CPUs
我的问题如下:
- 我原以为 CPU 使用率只是(所有非闲置 cpu 使用率)/(总 cpu 使用率)。因此我不明白为什么要考虑利率(#6 和#8)
- 这里的分子似乎是在尝试获取所有非空闲使用情况,并通过获取全部总和并减去空闲时间来实现。但是为什么一个用count,一个用sum呢?
- 如果我们通过
mode=idle
过滤来抓取 cpu 秒,那么添加by (mode)
会增加什么吗?反正只有一种模式?当有多个值时,我对by (something)
的理解更为相关,我们按该类别对值进行分组(正如我们在此查询中按cpu
所做的那样) - 最后,如上粗体所示,分子和分母中的double count()是什么意思?
这两个计数功能 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])))