PromQL 查询查找上周使用的 CPU 和内存

2024-06-23

我正在尝试编写一个 Prometheus 查询,它可以告诉我每个命名空间在一段时间内(比如一周)使用了多少 CPU(以及另一个用于内存和网络的百分比)。

我尝试使用的指标是container_spec_cpu_shares and container_memory_working_set_bytes但我无法弄清楚随着时间的推移如何将它们相加。无论我尝试什么,要么返回 0,要么返回错误。

任何有关如何为此编写查询的帮助将不胜感激。


要检查每个名称空间使用的内存百分比,您将需要类似于以下的查询:

sum( container_memory_working_set_bytes{container="", namespace=~".+"} )|
by (namespace) / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

上面的查询应该生成一个与此类似的图表:

免责声明!:

  • 上面的屏幕截图来自 Grafana,以便更好地查看。
  • 此查询不确认可用 RAM 中的更改(节点更改、节点自动缩放等)。

要在 PromQL 中获取一段时间内的指标,您将需要使用其他函数,例如:

  • avg_over_time(EXP[time]).

要返回过去并计算特定时间点的资源,您将需要使用:

  • offset TIME

使用上述指针查询应组合为:

avg_over_time( sum(container_memory_working_set_bytes{container="", namespace=~".+"} offset 45m) by (namespace)[120m:])  / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) 

上面的查询将计算每个命名空间使用的平均内存百分比,并将其除以从当前时间起 120 分钟内集群中的所有内存。它还将比现在提前 45 分钟开始。

Example:

  • 查询运行时间:20:00
  • avg_over_time(EXPR[2h:])
  • offset 45 min

上面的示例将从 17:15 开始,并将查询运行到 19:15。您可以修改它以包括整周:)。

如果您想按命名空间计算 CPU 使用情况,可以将此指标替换为以下指标:

  • container_cpu_usage_seconds_total{}- 请检查rate()使用此指标时的函数(计数器)
  • machine_cpu_cores{}

您还可以查看此网络指标:

  • container_network_receive_bytes_total- 请检查rate()使用此指标时的函数(计数器)
  • container_network_transmit_bytes_total- 请检查rate()使用此指标时的函数(计数器)

我在下面提供了更多解释,包括示例(内存)、测试方法和对所用查询的剖析。


我们假设:

  • Kubernetes cluster 1.18.6 (Kubespray) with 12GB of memory in total:
    • 主节点与2GB记忆的
    • 工人一节点8GB记忆的
    • 工作两个节点2GB记忆的
  • Prometheus 和 Grafana 安装有:Github.com:Coreos:Kube-prometheus https://github.com/coreos/kube-prometheus
  • Namespace kruk with single ubuntu pod set to generate artificial load with below command:
    • $ stress-ng --vm 1 --vm-bytes <AMOUNT_OF_RAM_USED> --vm-method all -t 60m -v

人工负载是通过以下方式生成的stress-ng两次:

  • 60 分钟 -1GB使用的内存
  • 60 分钟 -2GB使用的内存

命名空间使用的内存百分比kruk在这个时间跨度内:

  • 1GB,约占集群中所有内存 (12GB) 的 8.5%
  • 2GB,约占集群中所有内存 (12GB) 的 17.5%

Prometheus 查询的负载kruk命名空间看起来像这样:

计算使用avg_over_time(EXPR[time:]) / memory in the cluster显示使用率约为 13% ((17.5+8.5)/2) 查询人工荷载产生的时间时。这应该表明查询是正确的:


至于使用的查询:

avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:]) / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

上面的查询与一开始的查询非常相似,但我做了一些更改以仅显示kruk命名空间。

我将查询解释分为两部分(被除数/除数)。

Dividend

container_memory_working_set_bytes{container="", namespace="kruk"}

该指标将输出命名空间中的内存使用记录kruk。如果您要查询所有名称空间,请查看附加说明:

  • namespace=~".+"
  • container=""container=""仅当容器值为空时才匹配(下面引文中的最后一行)。
container_memory_working_set_bytes{container="POD",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/e249c12010a27f82389ebfff3c7c133f2a5da19799d2f5bb794bcdb5dc5f8bca",image="k8s.gcr.io/pause:3.2",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_POD_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 692224
container_memory_working_set_bytes{container="ubuntu",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/fae287e7043ff00da16b6e6a8688bfba0bfe30634c52e7563fcf18ac5850f6d9",image="ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_ubuntu_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2186403840
container_memory_working_set_bytes{endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2187096064

您可以在此处阅读有关暂停容器的更多信息:

  • Ianlewis.org:全能暂停容器 https://www.ianlewis.org/en/almighty-pause-container
sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)

该查询将按各自的命名空间对结果进行求和。offset 1380m用于回到过去进行测试的时间。

avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:])

此查询将从比当前时间早 1380m 开始的指定时间(到现在 120m)跨命名空间的内存指标计算平均值。

您可以阅读更多有关avg_over_time() here:

  • Prometheus.io:随时间的聚合 https://prometheus.io/docs/prometheus/latest/querying/functions/#aggregation_over_time
  • Prometheus.io:博客:子查询支持 https://prometheus.io/blog/2019/01/28/subquery-support/

Divisor

sum( machine_memory_bytes{})

该指标将汇总集群中每个节点的可用内存。

EXPR / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

专注于:

  • / ignoring (namespace) group_leftPrometheus.io:矢量匹配 https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching
  • * 100是相当不言自明的,并将结果乘以 100,看起来更像百分比。

其他资源:

  • Prometheus.io:查询:基础知识 https://prometheus.io/docs/prometheus/latest/querying/basics/
  • Timber.io:博客:人类的 Promql https://timber.io/blog/promql-for-humans/
  • Grafana.com:仪表板:315 https://grafana.com/grafana/dashboards/315
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PromQL 查询查找上周使用的 CPU 和内存 的相关文章

随机推荐

  • Bash:使用参数扩展查找和替换

    我想更换输入法 find string include 圆进度 38px 30px 4eb630 和输出 输出字符串 include 圆进度 38px 30px using find string pattern replacement s
  • 分解 SQL 表中每一行的 XML

    我有一个表 其中包含两列 ID 和 XML 数据 我想分解每个 ID 的 XML 我在 XML 中提取单个值 并且所有 XML 的结构都相同 我只是不确定如何循环遍历表并将 XML 查询应用于每一行 我需要应用的查询如下 Select to
  • MSVC:手动使用 link.exe

    我正在尝试使用测试 C OpenGL SDL 项目设置名为 Waf 的构建系统 但在链接过程中遇到了一些问题 据我所知 所有库都已正确找到 并添加到链接命令中 但链接过程似乎就像库未链接一样 为了尝试调试该过程 我尝试手动运行编译 链接过程
  • Ruby 中 block 和 &block 的区别

    为什么有时我应该在接受块的函数内使用 block 而有时应该使用 block block只是一个局部变量 block是对传递给该方法的块的引用 def foo block nil p block end foo gt nil foo tes
  • Nginx - “强制”200 缓存响应而不是 304

    是否有可能以某种方式强制执行 200 缓存 响应 而不是静态文件未修改的 304 响应 如果是这样 您可能会节省大量服务器请求 并显着加快回访者的加载时间 我发现单独的 Expires 并不能正确设置行为 下面是肯定的火 Set cache
  • 从 pdf 转换时的默认 imagemagick 密度

    我们有以下代码 convert foo pdf foo tiff 这多年来一直工作良好 并且生成的 tiff 具有合理的打印质量 我们刚刚升级了 imagemagick 现在 tiff 的分辨率较低 我假设最近的 IM 升级发生了一些变化
  • 使用 Quartz.net 配置 ADOJobStore

    如何使用 Quartz net 设置工作库 他们在网站上提供的教程对我没有帮助 在此页面中虽然有步骤http quartznet sourceforge net tutorial lesson 9 html http quartznet s
  • 私有 EC2 和 HTTP 流量中的 AWS 应用程序

    我有一个应用程序在私有子网的 EC2 实例中运行 以增加额外的安全性 直接从与公共子网关联的面向互联网的 NLB 接收流量 我还在公共子网中配置了一个 NAT 网关 以便私有 EC2 实例可以从 Internet 下载所需的任何内容 我刚刚
  • jQuery onclick addclass/removeclass 并添加淡入淡出

    在过去的三天里 我一直在寻找解决我的问题的方法 我见过很多人和我有同样问题的人 但没有一种解决方案可以解决我的问题 所以我又回到了起点 我请求你们友好的人们的帮助 我现在正在运行以下脚本 该脚本非常适合我 show commentsandn
  • 序列化和反序列化的 xstream 错误

    我在 Java 中使用 xStream 序列化 java 库中的 java 对象 并在客户端反序列化它 我有几个问题 如果我这样做 XStream xstream new XStream xstream setMode XStream ID
  • 动态添加 id 到每个表格单元格

    我正在尝试创建一个动态 js 表 我想动态地为每个单元格提供 id 我想使用这些 id 在不同的 js 事件处理程序中使用 怎样才能做到呢 我尝试过不同的方法 但没有一个有效
  • 如何从 SYSOUT 中删除 DFSORT 消息

    DFSORT 有多个消息 由具有多个排序操作的 COBOL 程序内部使用 我想删除那些 DFSORT 消息并仅保留 COBOL 程序中的消息 你有三个选择 使用 OUTDD ddname Enterprise COBOL 编译器选项更改用于
  • 使用 Retrofit 获取 api

    我有一个网络服务链接 我想用不同的 customerId 来访问它 其形式为 http apidev myserver com au 8980 TestService rest TestService jobs bycustid custo
  • 使图像跟随鼠标指针

    我需要一个火箭来跟随鼠标指针在我的网站上的移动 这意味着它应该旋转以面向运动方向 并且如果可能的话 根据它必须经过的距离加速 这可能吗 也许是jquery 通过使用 jquery 将 mousemove 注册到文档 将图像 css left
  • 为什么需要在 JavaScript 中冻结对象?

    我不清楚何时有人需要使用Object freeze在 JavaScript 中 MDN 和 MSDN 没有提供有用的现实生活示例 我知道尝试在运行时更改这样的对象意味着崩溃 问题是 我什么时候会欣赏这次崩溃 对我来说 不变性是一个设计时间约
  • 如何将文字转换为十六进制值

    从文本文件中读取 2 个字符的值的十六进制表示形式 例如 0C 我需要将相应的十六进制值 X 0C 存储在程序变量中 如以下代码所示 我知道 COBOL 允许执行诸如 MOVE X 0C TO somevariable 之类的操作 但在我的
  • 如果参数不存在,Spring 4.1.5 MVC @RequestParam(required = false, value = "somevalue") 将失败

    我有一个 spring mvc 控制器 它正在为具有多个请求参数的 Web 服务请求提供服务 所有参数均已标注required false 如果请求中的参数不可用 RequestMapping value service deployNew
  • Vue.js 拦截器

    我怎样才能使用interceptor in vue js 因此 在每个请求 响应之前 它应该首先进入拦截器 我已经搜索了很多 但找不到关于此的好的文档 我想像这样使用 JWTAuth function define use strict d
  • 瓦丁组合框

    我想创建 Vaadin 下拉菜单 其中有 2 个分隔符 我找不到实现该方法的方法 任何人都可以帮助我解决这个问题吗 这是我想要显示下拉列表的方式 Option 1 Option 2 select 1 select 2 group 1 我怎样
  • PromQL 查询查找上周使用的 CPU 和内存

    我正在尝试编写一个 Prometheus 查询 它可以告诉我每个命名空间在一段时间内 比如一周 使用了多少 CPU 以及另一个用于内存和网络的百分比 我尝试使用的指标是container spec cpu shares and contai