VictoriaMetrics vmanomaly 调度器(Scheduler)完全指南:周期、一次性与回测三种模式配置详解
2026/9/13 13:04:31 网站建设 项目流程

VictoriaMetrics vmanomaly 调度器(Scheduler)完全指南:周期、一次性与回测三种模式配置详解

【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics

导读

调度器(Scheduler)是 VictoriaMetrics Anomaly Detection(vmanomaly)的核心组件之一,它决定了模型多久执行一次推理(inference)以多大的时间窗口训练(fit)模型,以及在哪个时间范围内产出异常分数。本文基于仓库 scheduler.md 展开,完整覆盖周期性调度器(Periodic)、一次性调度器(Oneoff)与回测调度器(Backtesting)三种模式的全部参数、配置示例与适用场景,并结合仓库中的快速开始文档、FAQ、监控指标与真实部署配置进行源码级佐证。读完本文,你将能够针对生产实时检测、历史数据一次性回填、配置回测评估等不同场景,正确编写与调优vmanomalyschedulers配置段。

调度器在 vmanomaly 架构中的位置与作用

vmanomaly中,调度器定义了"何时运行、多久运行一次推理,以及用哪个时间范围训练模型",它在配置文件的scheduler(旧格式)或schedulers(推荐格式)段中声明。调度器与 models、reader、writer、settings、monitoring 共同构成vmanomaly的组件体系。

从仓库的完整配置示例可见调度器的实际用法——QuickStart.md 中的示例在schedulers段声明了online_5m调度器,infer_every: '5m'表示每 5 分钟对最新数据执行一次推理,fit_window: '4w'表示使用最近 4 周数据进行模型训练:

schedulers: online_5m: class: 'periodic' infer_every: '5m' scatter_infer_jobs: true fit_every: '1000d' fit_window: '4w'

仓库自带的 Docker 集成部署配置 vmanomaly_config.yml 同样采用schedulers段,并给出了fit_every: "1000d"的"仅引导(bootstrap-only)"用法,即只在启动时训练一次、之后完全依赖模型的在线增量更新:

schedulers: periodic: infer_every: "1m" fit_every: "1000d" # bootstrap-only schedule; use a finite cadence if accumulated state must be reset fit_window: "2w"

说明:vmanomaly是 VictoriaMetrics 的**企业版(Enterprise)**组件,本文所述配置均基于该组件的文档与仓库部署示例。

新旧配置格式:schedulerschedulers的演进

v1.11.0起,scheduler段支持通过别名(aliasing)声明多个调度器,且vmanomaly要求该段命名为schedulers。使用旧的扁平格式(scheduler键)已被标记为deprecated,并将在未来版本中移除。

旧格式配置(已弃用):

scheduler: # class: "periodic" # 或 class: "scheduler.periodic.PeriodicScheduler"(v1.13.0 之前,不支持 class 别名) infer_every: "1m" fit_every: "2m" fit_window: "3h" ...

该配置会被隐式转换为:

schedulers: default_scheduler: # 默认调度器别名,用于向后兼容 class: "scheduler.periodic.PeriodicScheduler" infer_every: "1m" fit_every: "2m" fit_window: "3h" ...

多调度器意味着可以在同一份配置中为不同的模型绑定不同的推理节奏。例如 FAQ 中展示了用periodic_5m(每 5 分钟推理一次)与periodic_forecast(每 24 小时推理一次)两个调度器分别驱动"常规简单模型"与"每日预测模型"的典型场景(参见 FAQ.md)。

调度器 class 参数与三种内建类型

class参数类型为 str,默认值为"scheduler.periodic.PeriodicScheduler",可选值如下:

class 值用途
"scheduler.periodic.PeriodicScheduler"生产环境默认选择。周期性对新数据运行模型以生成 异常分数(anomaly score),并持续对已挂载的模型进行重新训练,以对抗数据漂移(data drift)与模型随时间的性能退化。
"scheduler.oneoff.OneoffScheduler"仅运行一次任务后退出。适合测试或对历史数据做一次性回填。
"scheduler.backtesting.BacktestingScheduler"模拟 PeriodicScheduler 的行为,但只运行一次后退出。用于在已标注过事件的历史数据上回测,评估模型在过去的表现。

v1.13.0起支持class 别名,即"scheduler.periodic.PeriodicScheduler"可简写为"periodic""scheduler.oneoff.OneoffScheduler"可简写为"oneoff""scheduler.backtesting.BacktestingScheduler"可简写为"backtesting"。仓库所有最新示例均使用短别名形式。

需要特别强调的是:不同的 class 使用的参数完全不同,下文按类型逐一展开。

PeriodicScheduler:生产环境下的周期推理与重训练

参数总览

周期性调度器的参数以时间差(duration)表示,时间粒度由字符串末尾字符决定,例如"50s"(秒)、"4m"(分钟)、"3h"(小时)、"2d"(天)、"1w"(周)。

参数类型示例说明
fit_windowstr14d用于训练模型的时间范围,最小为 1 秒。
infer_everystr1m模型在多长时间间隔内对新数据点产出并写入异常分数,最小为 1 秒。
fit_everystr, Optional1h完全重新训练模型的频率。若未设置,则使用infer_every的值,即每次推理前都重新训练。
start_from(自 v1.18.5)str, Optional2024-11-26T01:00:00Z01:00指定首次fit_every调用的触发时刻。接受 ISO 8601 日期时间或HH:MM格式时间。若指定时间已过去,则基于fit_every间隔计算下一个合适时间;对于HH:MM格式,若时间已过,则顺延到次日的同一时刻(尊重tz参数)。默认时区为UTC
tz(自 v1.18.5)str, OptionalAmerica/New_Yorkstart_from指定本地时区,默认UTC
scatter_infer_jobs(自 v1.29.7)bool, Optionaltrue/false若为true,将推理任务及其依赖的数据拉取任务在推理间隔内均匀分散,避免高扩展配置下同步化的读放大与推理突发。默认false。当settings.n_workers > 1reader.queries基数高且infer_every较小时尤为有用。

实战配置示例

schedulers: periodic_scheduler_alias: class: "periodic" # (v1.13.0 之前不支持 class 别名,需写 class: "scheduler.periodic.PeriodicScheduler") fit_window: "14d" infer_every: "1m" scatter_infer_jobs: true # 将推理任务均匀分散到推理间隔内,降低同步突发 fit_every: "1h" start_from: "20:00" # 若在 20:00(基辅本地时间)之前启动,首次运行在当天 20:00;否则在次日 20:00 tz: "Europe/Kyiv" # 未指定时默认 'UTC'

该配置的行为解读:vmanomaly在每次fit_every触发时,取从调用时刻向前 14 天的时间窗口训练模型。从今天基辅时间 20:00(若晚于 20:00 启动则为明天 20:00)开始每小时重训练一次,每次都使用最近 14 天的数据——因此每次重训练都会多包含 1 小时的新数据,但时间窗口严格保持 14 天,不会随多次重训练而延长。与此同时,vmanomaly每分钟执行一次推理,用最新模型处理新到达的数据点。

使用 start_from 的注意事项

[!WARNING] 如果使用了start_from参数,建议同时在配置的 settings 段 中设置restore_state: true,使调度器能在被终止或重启后(若重启发生在两次调度运行之间)恢复上一次运行的状态并无中断地继续产出异常分数;否则服务将保持空闲,直到未来的start_from时刻到达。例如start_from设为20:00,服务在 20:30 被终止并重启,那么在次日 20:00 到来之前(约 23 小时 30 分钟的空闲期)不会产出任何异常分数。

关于状态恢复的机制细节可参考 settings.md:restore_state(自 v1.24.0)使vmanomaly具备状态性,在重启后恢复服务元数据与已拟合模型状态;该功能需要启用模型的 on-disk 模式(否则服务会在restore_state: true时直接报错退出)。

调度器故障自愈与监控

v1.30.0起,如果某个周期调度器的工作进程意外退出,服务会以**指数退避(exponential backoff)**尝试有界重启,而不会连带关闭其他无关调度器。建议监控vmanomaly_scheduler_alivevmanomaly_scheduler_restarts_total(见 monitoring.md),对持续失败进行告警。FAQ 中也建议将这两个指标与vmanomaly_scheduler_alivevmanomaly_scheduler_restarts_total关联分析(见 FAQ.md 附近)。

v1.30.1起,对于支持精确(exact)能力的在线模型,infer_every同时也是因果模型更新节奏:当延迟的周期任务一次性取回多条观测时,它们会按照与精确回测相同的时序网格处理,而非作为一个行为不同的批量。

OneoffScheduler:运行一次即退出

Oneoff 调度器运行一次任务后退出,适合测试新配置或对历史数据做一次性回填。需要注意:

[!WARNING] 截至最新版本,Oneoff 调度器不能与状态恢复(stateful service)组合使用。它设计为运行一次即退出,不跨运行维护状态。启用时会记录日志警告,且内部状态不会被保存与恢复。若需要周期性运行或维护状态,请改用 Periodic 调度器。

时间格式

Oneoff 调度器的时间范围可用Unix 时间(秒)ISO 8601 字符串定义。ISO 格式支持的时区偏移写法:

  • Z(UTC)
  • ±HH:MM
  • ±HHMM
  • ±HH

若省略时区,则使用不含时区信息的 datetime。

训练时间范围参数

格式参数类型示例说明
ISO 8601fit_start_isostr"2022-04-01T00:00:00Z""2022-04-01T00:00:00+01:00""2022-04-01T00:00:00+0100""2022-04-01T00:00:00+01"训练模型的开始时间(ISO 字符串或 Unix 秒)。
UNIX timefit_start_sfloat1648771200同上。
ISO 8601fit_end_isostr"2022-04-10T00:00:00Z"及上述偏移变体训练模型的结束时间,必须大于fit_start_*
UNIX timefit_end_sfloat1649548800同上。

推理时间范围参数

格式参数类型示例说明
ISO 8601infer_start_isostr"2022-04-11T00:00:00Z"及偏移变体模型推理的开始时间。
UNIX timeinfer_start_sfloat1649635200同上。
ISO 8601infer_end_isostr"2022-04-14T00:00:00Z"及偏移变体模型推理的结束时间,必须大于infer_start_*
UNIX timeinfer_end_sfloat1649894400同上。

ISO 格式配置示例

schedulers: oneoff_scheduler_alias: class: "oneoff" # (v1.13.0 之前写 class: "scheduler.oneoff.OneoffScheduler") fit_start_iso: "2022-04-01T00:00:00Z" fit_end_iso: "2022-04-10T00:00:00Z" infer_start_iso: "2022-04-11T00:00:00Z" infer_end_iso: "2022-04-14T00:00:00Z"

UNIX 时间格式配置示例

schedulers: oneoff_scheduler_alias: class: "oneoff" # (v1.13.0 之前写 class: "scheduler.oneoff.OneoffScheduler") fit_start_s: 1648771200 fit_end_s: 1649548800 infer_start_s: 1649635200 infer_end_s: 1649894400

BacktestingScheduler:在历史数据上回测配置

Backtesting 调度器模拟 PeriodicScheduler 的运行方式,但只执行一次后退出,用于在包含已标注事件的历史数据上评估模型表现——即"如果模型在过去这样运行,效果会如何"。在 FAQ 的 backtest 示例 中,它被用来在部署新模型或新配置前,围绕已标注事件的历史区间验证效果。FAQ 进一步解释了其内部机制(见 FAQ.md):配置将产生 N 个完整区间(fit_window=14d +fit_every=1h)直到to_iso时间戳,逐次执行 fit 训练模型,再用这些模型在每段fit_every末尾产出M = [fit_every / sampling_period]个推理数据点,模拟 PeriodicScheduler 中连续 M 次infer_every调用,并将结果写回writer指定的 VictoriaMetrics TSDB 供 VMUI 或 Grafana 可视化。

与 Oneoff 类似:

[!WARNING] 截至最新版本,Backtesting 调度器不能与状态恢复组合使用,同样以"运行一次即退出"为设计目标,内部状态不会被保存与恢复。

v1.26.0起,BacktestingScheduler 的 inference-only 模式被用于vmanomaly内置 UI 中的历史数据回测,帮助用户在配置上线前验证其是否符合预期(参见 UI.md)。

并行化参数:n_jobs

参数类型示例说明
n_jobsint1允许在历史数据上按比例更快(但更耗资源)地评估配置。默认值为 1,即顺序执行。该参数于 v1.13.0 引入。

Inference only 模式(自 v1.22.1 起)

自 v1.22.1 起提供更直观的回测模式。在Inference only模式下,通过[from, to](或[from_iso, to_iso])指定的时间窗口仅用于推理,对应的训练(fit)窗口由系统自动推导。启用方式:

inference_only: true

(默认值为false,以保持向后兼容。)

其工作方式为:

  1. 推理窗口(Inference Window)
    • from/to(或from_iso/to_iso)参数定义;
    • 每个推理片段跨度为配置的fit_every时长。
  2. 训练窗口(Training Window)
    • 自动设为紧跟每个推理片段之前的fit_window时长;
    • 确保每个模型在推理前都基于最近的fit_window数据完成训练。
配置参数
  • inference_only: true:启用上述仅推理行为。
  • fromto(或from_isoto_iso):总体的仅推理时间范围。
  • fit_window:每次训练使用的历史数据时长(如P7DPT1H)。
  • fit_every:连续训练/推理周期之间的间隔。
  • (自 v1.28.0)exact:若为true,BacktestingScheduler 将以等于infer_every的小批量时序块对在线模型执行推理,以模拟生产调度器(默认false)。
  • (自 v1.28.0)infer_every:可选的推理网格;在 exact 模式下是两次 fit 之间的模型调用节奏。(自 v1.30.1)在inference_only模式下,若省略该值,则由有效查询步长或 reader 采样周期推导,并受fit_every限制;仅当二者都不可用时才回退为fit_every
  • n_jobs:回测并行任务数(默认1)。
示例
# other config sections ... schedulers: backtesting_inference_only: # scheduler alias class: "backtesting" fit_window: "P7D" # 每个推理片段之前 7 天数据用于训练 fit_every: "PT12H" # 推理间隔 12 小时 exact: true # 为在线模型启用 exact 模式,不影响离线模型 infer_every: "PT1H" # exact 模式下的推理节奏,仅在 exact: true 时使用 inference_only: true # 仅使用 [from, to] 构造推理窗口 from_iso: "2025-05-08T03:00:00Z" to_iso: "2025-05-09T00:00:00Z" n_jobs: 2 # 并行任务数

上述配置将产生2 个推理区间

  • 完整推理区间(12h):2025-05-08T12:00:00Z-2025-05-09T00:00:00Z
    训练窗口(7d):2025-05-01T12:00:00Z-2025-05-08T12:00:00Z
  • 部分推理区间(9h):2025-05-08T03:00:00Z-2025-05-08T12:00:00Z
    (起点被from_iso"裁剪",因此小于fit_every
    训练窗口(7d):2025-05-01T03:00:00Z-2025-05-08T03:00:00Z

在每个推理区间上,使用对应训练窗口拟合的模型计算异常分数。

遗留模式:显式定义总体时间范围

该遗留模式仅为向后兼容保留,使用起来不如 inference-only 直观。仅在无法升级到 v1.22.1 或更高版本时使用。

该时间范围将按区间(fit_window, infer_window == fit_every)切片:从最新的可用时间点(即to_*)开始向前回溯,直到提供的时间范围内不再存在完整的fit_window + infer_window区间为止。

格式参数类型示例说明
ISO 8601from_isostr"2022-04-01T00:00:00Z"及偏移变体回测的开始时间。
UNIX timefrom_sfloat1648771200同上。
ISO 8601to_isostr"2022-04-10T00:00:00Z"及偏移变体回测的结束时间,必须大于from_start_*
UNIX timeto_sfloat1649548800同上。

遗留模式:训练时间范围(fit_window)

与 Periodic 调度器相同的显式逻辑。fit_window支持两种写法:

格式参数类型示例说明
ISO 8601fit_windowstr"PT1M""P1H"训练模型使用的时间范围,最小为 1 秒。
Prometheus 兼容fit_windowstr"1m""1h"同上。

遗留模式:推理时间范围(fit_every)

自 v1.28.0 起,推理窗口可以由infer_every: {xxx}{unit}配合exact=True为在线模型显式定义;否则,离线模型及exact=False的在线模型使用下述遗留隐式逻辑。

在 BacktestingScheduler 中,推理窗口隐式地定义为两次连续fit_every运行之间的时间段:最新的推理窗口从to_s-fit_every开始,到最新的可用时间点to_s结束;更早的 fit/infer 区间按fit_every秒向前平移,直到得到最后一个起点 >=from_s的完整fit_window训练区间。

格式参数类型示例说明
ISO 8601fit_everystr"PT1M""P1H"在下次重训练前,使用已训练模型对新数据推理的时间范围。
Prometheus 兼容fit_everystr"1m""1h"同上。

遗留模式配置示例

ISO 格式:

schedulers: backtesting_scheduler_alias: class: "backtesting" # (v1.13.0 之前写 class: "scheduler.backtesting.BacktestingScheduler") from_iso: '2021-01-01T00:00:00Z' to_iso: '2021-01-14T00:00:00Z' fit_window: 'P14D' fit_every: 'PT1D' exact: true # 为在线模型启用 exact 模式,不影响离线模型 infer_every: 'PT1H' # exact 模式下的推理节奏,仅在 exact=true 时使用 n_jobs: 1 # 默认 = 1(顺序执行),可设置为 CPU 核数以并行执行

UNIX 时间格式:

schedulers: backtesting_scheduler_alias: class: "backtesting" # (v1.13.0 之前写 class: "scheduler.backtesting.BacktestingScheduler") from_s: 167253120 to_s: 167443200 fit_window: '14d' fit_every: '1d' exact: true # 为在线模型启用 exact 模式,不影响离线模型 infer_every: '1h' # exact 模式下的推理节奏,仅在 exact=true 时使用 n_jobs: 1 # 默认 = 1(顺序执行),可设置为 CPU 核数以并行执行

调度器与模型、Reader 的联动及调优建议

调度器参数并非孤立存在,它与模型与数据读取环节紧密联动:

  • 模型通过schedulers参数挂载调度器:在 models.md 中,模型可指定schedulers: ['scheduler_alias']绑定到特定调度器(参见 FAQ.md);若省略,模型会挂载到所有已定义的调度器上。当多个模型需要以不同节奏训练/推理时,应按调度器拆分配置(见 FAQ.md 的拆分建议)。FAQ 中还提供了config_splitter.py工具(自 v1.18.5),可按schedulersmodelsqueries等逻辑实体拆分父配置为多个可独立运行的子配置(见 FAQ.md)。
  • scatter_infer_jobs: true的适用条件:当settings.n_workers > 1reader.queries基数高且scheduler.infer_every较小时,开启该参数可将推理任务在间隔内均匀分布,减少资源争用(见 QuickStart.md 的调优建议)。
  • fit_window的注意事项fit_window越大,单次查询的数据量越大,越容易触发服务端search.maxQueryDuration超时或search.maxPointsPerTimeseries上限。FAQ 建议将长窗口的大查询拆分为更小的子查询,在vmanomaly侧重建数据(见 FAQ.md 与 QuickStart.md)。QuickStart 示例中max_points_per_query: 15000正是为应对长查询命中search.maxPointsPerTimeseries而设的 reader 级参数。
  • 配置校验:在部署前可使用--dryRun命令行参数校验配置——解析并合并所有 YAML 文件、执行 schema 检查、记录错误与警告后退出,无需启动服务或申请许可证(见 QuickStart.md)。

小结

调度器是vmanomaly中控制"何时训练、何时推理"的节奏器,三种内建类型覆盖了完整的使用场景:PeriodicScheduler面向生产环境的持续检测与抗漂移重训练,核心参数为fit_windowinfer_everyfit_every,可选start_from/tz控制首训时刻、scatter_infer_jobs平滑推理负载;OneoffScheduler面向一次性测试与历史回填,使用fit_start/endinfer_start/end(ISO 或 Unix 秒)定义时间范围;BacktestingScheduler面向配置回测,支持n_jobs并行加速,并在 v1.22.1 起提供自动推导训练窗口的 inference-only 模式,在 v1.28.0 起支持以exact+infer_every为在线模型精确模拟生产调度节奏。理解并善用这些参数,是让异常检测模型在正确的时间窗口上训练、在正确的频率下推理,从而输出可信异常分数的关键。

【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询