kubernetes - 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,这样我就可以减少查询必须经过的点数。
但是,这不会扭曲价值观吗?
解决方案
正如您已经观察到的,聚合分位数(随着时间的推移或其他方式)并没有真正起作用。
您可以尝试使用记录规则构建内存使用量的直方图,看起来像“真实”的 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:
推荐阅读
- python - 在 matplotlib 中设置 CheckBox 的逻辑状态而不触发回调?
- php - 使用 Laravel 注册用户并插入数据库
- r - ggplot - 限制 x 和 y 时 abline 消失
- ruby - Sinatra 我不能使用 rake -T
- sql-server - 无法创建过程错误:必须声明标量变量“@TableName”
- angular - Typing for object with similar key but different value
- migration - 从 PHP7.0 迁移到 7.1 和类型声明
- php - 如何在短代码中插入 php 代码 $_SESSION?
- primefaces - PrimeFaces 组织图划分问题
- elasticsearch - 在结果中具有相同属性的对象数组上的 Elasticsearch 聚合