我想从最近的x次中获得我的Pod的0.95%内存使用率。但是,如果我使用“大”(7 / 10d)范围,则此查询开始会花费太长时间。
我现在正在使用的查询是:
quantile_over_time(0.95, container_memory_usage_bytes[10d])
大约需要100秒才能完成
为简洁起见,我删除了多余的名称空间过滤器
我可以采取哪些步骤使此查询的性能更高? (除了使机器更大外)
我考虑过每x次(假设30分钟)计算0.95%的百分比并将其标记为 p95_memory_usage ,并在查询中使用 p95_memory_usage 而不是 container_memory_usage_bytes em>,这样我就可以减少查询必须经过的点数。
但是,这不会扭曲值吗?
答案 0 :(得分:2)
正如您已经观察到的,累计分位数(随着时间的推移或其他方式)并没有真正的作用。
您可以尝试使用记录规则建立一段时间内内存使用情况的直方图,看起来像一个“真实的”普罗米修斯直方图(由_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: