【问题标题】:PromQL query to find CPU and memory used for the last weekPromQL 查询以查找上周使用的 CPU 和内存
【发布时间】:2020-07-07 08:06:56
【问题描述】:

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

我尝试使用的指标是container_spec_cpu_shares 和container_memory_working_set_bytes,但我不知道随着时间的推移如何对它们求和。无论我尝试什么,要么返回 0,要么返回错误。

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

【问题讨论】:

  • 您好,请告知您是否检查过此线程:serverfault.com/questions/978932/…
  • 嗨,戴维,我确实看到了那个帖子。这是一个非常有用且详细的答案,非常适合监控集群。问题是我正在尝试创建查询来查找一段时间内使用的 CPU 和内存的百分比,这有点不同

标签: kubernetes prometheus promql


【解决方案1】:

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

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 分钟开始。

例子:

  • 查询运行时间: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 集群1.18.6 (Kubespray) 总共有 12GB 内存:
    • 具有2GB 内存的主节点
    • 具有8GB 内存的worker-one 节点
    • 具有2GB 内存的worker-two 节点
  • Prometheus 和 Grafana 安装:Github.com: Coreos: Kube-prometheus
  • 命名空间 kruk 与单个 ubuntu pod 设置为使用以下命令生成人工负载:
    • $ stress-ng --vm 1 --vm-bytes <AMOUNT_OF_RAM_USED> --vm-method all -t 60m -v

使用stress-ng 生成了两次人工负载:

  • 60 分钟 - 1GB 已用内存
  • 60 分钟 - 2GB 已用内存

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

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

来自 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 命名空间。

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

股息

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

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

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() 的更多信息:

除数

sum( machine_memory_bytes{})

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

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

专注于:


其他资源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多