首页 > 解决方案 > Prometheus 查询 pod 内存使用性能的分位数

问题描述

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

但是,这不会扭曲价值观吗?

标签: kubernetesprometheusquantile

解决方案


正如您已经观察到的,聚合分位数(随着时间的推移或其他方式)并没有真正起作用。

您可以尝试使用记录规则构建内存使用量的直方图,看起来像“真实”的 Prometheus 直方图(由和指标组成) _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:


推荐阅读