![](/img/trans.png)
[英]Kubernetes: Comparing RSS Memory Usage of Pods and Pod Memory Requirements in Prometheus / PromQL
[英]Prometheus query quantile of pod memory usage performance
我想获得上次 x 次我的 pod 的 0.95 个百分位数 memory 使用情况。 但是,如果我使用“大”(7 / 10d)范围,此查询开始花费的时间太长。
我现在使用的查询是:
quantile_over_time(0.95, container_memory_usage_bytes[10d])
大约需要 100 秒才能完成
为了简洁起见,我删除了额外的命名空间过滤器
我可以采取哪些步骤来提高此查询的性能? (除了把机器做大)
我考虑过每 x 次(假设 30 分钟)和 label 计算 0.95 个百分位数p95_memory_usage并在查询中使用p95_memory_usage而不是container_memory_usage_bytes ,这样我就可以将查询必须通过的点数减少到 go。
但是,这不会扭曲价值观吗?
正如您已经观察到的,总计分位数(随着时间的推移或其他方式)并没有真正起作用。
您可以尝试使用记录规则建立一段时间内内存使用情况的直方图,看起来像一个“真实的”普罗米修斯直方图(由_bucket
, _count
和_sum
指标组成),尽管这样做可能很乏味。 就像是:
- record: container_memory_usage_bytes_bucket
labels:
le: 100000.0
expr: |
container_memory_usage_bytes > bool 100000.0
+
(
container_memory_usage_bytes_bucket{le="100000.0"}
or ignoring(le)
container_memory_usage_bytes * 0
)
对您感兴趣的所有存储桶大小重复上述步骤,然后添加_count
和_sum
指标。
直方图可以聚合(随时间推移或其他方式)而不会出现问题,因此您可以使用第二组记录规则,以较低的分辨率(例如每小时或每天增加,每小时或每天分辨率)计算直方图指标的增加。 最后,您可以在低分辨率直方图(比原始时间序列少的样本)上使用histogram_quantile
来计算分位数。
不过,这需要进行大量工作,并且会有一些缺点:您只会每小时/每天对分位数进行一次更新,而准确性可能会更低,具体取决于您定义的直方图桶数。
否则(这只是在写完上述所有内容后才出现的),您可以定义一个以较低分辨率(例如,每小时一次)运行的记录规则,并记录container_memory_usage_bytes
指标的当前值。 然后,您可以继续在此较低分辨率指标上使用quantile_over_time
。 显然,您将失去精度(因为您丢弃了大量样本),并且分位数仅每小时更新一次,但这要简单得多。 您只需要等待10天,看看结果是否足够接近。 (o:
quantile_over_time(0.95, container_memory_usage_bytes[10d])
查询可能会很慢,因为它需要考虑过去 10 天所有container_memory_usage_bytes
时间序列的所有原始样本。 要处理的样本数量可能非常大。 可以使用以下查询进行估算:
sum(count_over_time(container_memory_usage_bytes[10d]))
请注意,如果quantile_over_time(...)
查询用于在 Grafana 中构建图形(又名range query
而不是instant query
),则必须乘以从sum(count_over_time(...))
返回的原始样本数通过 Grafana 图上的点数,因为 Prometheus 对显示图上的每个点单独执行quantile_over_time(...)
。 通常 Grafana 需要大约 1000 个点来构建平滑图。 因此,从sum(count_over_time(...))
返回的数字必须乘以 1000,以估计 Prometheus 需要处理以构建quantile_over_time(...)
图的原始样本数。 请参阅本文中的更多详细信息。
减少查询时长有以下解决方案:
[10d]
更改为[1d]
可将要处理的原始样本数量减少 10 倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.