You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用滑动窗口优化VictoriaMetrics中重复的increase()查询?

问题

我每30秒在VictoriaMetrics中执行以下PromQL查询:

sum by (label_1) (increase(sample_metric[1d]))

该查询按label_1分组计算sample_metric过去1天的增量,但每次执行时,VictoriaMetrics都需要重新计算整个1天窗口的增量。

想知道VictoriaMetrics是否有相关配置或方法,支持以滑动窗口方式执行该查询,无需每次重算完整1天的增量,仅计算上次查询以来(最近30秒)的增量?

我的目标是在保证结果准确的前提下,通过减少冗余计算提升效率。额外背景:我使用VictoriaMetrics,该查询每30秒执行一次,寻求能最小化查询开销且保持结果正确的方案。我曾查阅文档但未找到明确的增量计算或滑动窗口实现方式,希望找到可行的配置或查询优化方法。


可行优化方案

1. 利用Rollup预聚合(效率最高)

VictoriaMetrics支持通过rollup规则预计算长时间窗口的聚合结果,彻底避免每次查询全量扫描原始数据:

  • 创建rollup规则文件(如sample_rollup.yaml),定义与查询频率匹配的预计算任务:
    groups:
    - name: sample_metric_aggregation
      interval: 30s  # 和你的查询频率保持一致
      rules:
      - record: sample_metric:increase_1d:sum_by_label1
        expr: sum by (label_1) (increase(sample_metric[1d]))
    
  • 启动VictoriaMetrics或vmagent时加载该规则(添加启动参数-promscrape.config=/path/to/sample_rollup.yaml)。
  • 后续直接查询预聚合指标sample_metric:increase_1d:sum_by_label1即可,VictoriaMetrics会每隔30秒自动计算并存储结果,查询时只需读取预生成的数据,无需再扫描1天的原始样本。

2. 滑动窗口增量累加(轻量状态依赖)

如果不想配置rollup规则,可以通过PromQL的状态函数实现增量更新,仅计算最近30秒的增量并累加历史值:

sum by (label_1) (increase(sample_metric[30s])) 
+ last_over_time(sum by (label_1) (increase(sample_metric[1d] offset 30s))[1m:30s])
  • 第一部分sum by (label_1) (increase(sample_metric[30s])):计算本次查询周期(最近30秒)的增量
  • 第二部分last_over_time(...):获取上一次查询时的1天累计增量(通过offset 30s偏移到上次查询的时间窗口,再取最近1分钟内的最后一个值确保拿到有效历史结果)
  • 两者相加得到当前完整的1天增量
  • 注意:该方案要求查询频率严格保持30秒,否则会出现增量重复或遗漏,导致结果偏差。

3. 窗口对齐优化(有限效果)

VictoriaMetrics默认按当前时间对齐查询窗口,你可以通过@语法指定对齐时间,减少重复扫描的重叠范围,但本质仍属于全量扫描,优化效果有限:

sum by (label_1) (increase(sample_metric[1d] @ time() - 30s))

该方式仅适用于对实时性要求不高的场景。


关键注意事项

  • rollup预聚合是最优方案,异步计算+存储结果的模式能将查询开销降到最低。
  • 滑动窗口累加方案必须严格匹配查询频率与时间窗口,否则会破坏结果准确性。
  • 所有优化方案都需要对比原始查询的输出,验证结果一致性后再投入使用。

内容的提问来源于stack exchange,提问作者Rohith Basavaraja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:01:09