错峰与漂移控制是什么
错峰解决的是「同一时刻涌入」的问题:当大量主机或大量任务被配置在同一个时间点启动,会造成带宽、连接数、共享依赖的集中挤兑。漂移指的是实际开始时间与计划时间逐渐偏离,常见原因是任务耗时超过调度周期,或在资源紧张时排队等待。控制手段是给触发时刻加入偏移:确定性偏移(按主机名或任务名哈希取模)比纯随机更可控,因为每次错峰的落点一致、峰值可预先计算;同时必须给执行时长设上限。
基本信息
| 常见手段 | 确定性偏移(哈希取模)、随机延迟、分批推进、调度器自带随机化参数 |
|---|---|
| 相关参数 | systemd RandomizedDelaySec、Kubernetes startingDeadlineSeconds、脚本内主动 sleep |
| 需要观测 | 实际开始时间分布、执行时长分布、排队长度 |
| 关键判据 | 任务耗时是否接近或超过调度周期 |
典型使用场景
- 数百台主机使用同一份定时任务采集数据,需要打散
- 多个批量任务被配置在整点启动并读取同一份数据
- 证书或配置轮换需要错开重启窗口
- 定时校验任务与业务高峰重叠,需要移到低峰
- 长任务耗时已经接近周期,需要重新评估周期设计
两种错峰写法
两种错峰写法
# 按主机名做确定性偏移,落点稳定可预测
offset=$(( $(hostname | cksum | cut -d' ' -f1) % 1800 ))
sleep "$offset"
/opt/bin/collect.sh
# systemd timer:为同一 service 的多个实例加入随机延迟
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=1800
Persistent=true错峰手段与注意点
| 手段 | 效果 | 注意点 |
|---|---|---|
| 确定性偏移 | 分布稳定、峰值可预测 | 主机更名或增删会改变分布 |
| 随机延迟 | 实现简单 | 峰值位置不可预测,难以与窗口对齐 |
| 分批推进 | 可控分批 | 需要额外的批次状态管理 |
| 调度器随机参数 | 无需修改脚本 | 行为依赖具体调度器与版本 |
| 延长调度周期 | 从根源消除漂移 | 可能不满足业务时效要求 |
错峰的目标是让峰值可控而不是消除峰值。确定性偏移配合容量规划,可以先算出最坏情况下有多少台同时启动,再验证共享依赖能否承受。
如果任务耗时已经超过调度周期,任何错峰都只是把冲突推迟。此时应先判断任务是否该拆分、是否需要并发保护,或把周期改长,否则任务会持续堆积。