Prometheus Pod内存使用性能查询分位数

时间:2019-06-18 15:17:39

标签: kubernetes prometheus quantile

我想从最近的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>,这样我就可以减少查询必须经过的点数。

但是,这不会扭曲值吗?

1 个答案:

答案 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: