滚动窗口控制是什么
滚动窗口指始终保持固定数量的在途任务:一个完成就立刻补进下一个,而不是等整批全部结束再开始下一批。它避免了固定批次的木桶效应——在固定批次里,最慢的任务会让其余执行槽位空转。实现方式包括并行任务数限制、滑动窗口配合队列、以及抢占式领取任务的执行者池。代价是在途数量上限必须明确,并配套失败计数与终止条件,否则失败任务会持续累积直到资源耗尽。
基本信息
| 常见参数 | xargs -P、GNU parallel -j、Ansible forks、自建执行者池的并发上限 |
|---|---|
| 与固定批次区别 | 固定批次要等最慢的完成,滚动窗口完成即补位 |
| 关键控制 | 在途上限、失败计数、失败率阈值与终止条件 |
| 适用场景 | 各目标耗时差异明显的大批量作业 |
典型使用场景
- 单目标耗时差异大,快的几秒、慢的几分钟
- 需要在控制并发的前提下把总时长压到最短
- 长短任务混合的队列
- 需要在固定并发下持续处理大量对象
- 需要边执行边观察,而不是等整批结束才知道结果
滚动窗口实现
滚动窗口实现
# 固定并发 8,完成一个立刻补下一个
xargs -P 8 -n 1 -a targets.txt do_one
# GNU parallel:保留作业日志,便于统计每台耗时
parallel -j 8 --joblog run.log --results out/ do_one {} ::: $(cat targets.txt)
# 自建滑动窗口:维护在途数量,达到上限就等空位(含失败上限)
while read -r t; do
[ "$failed" -ge 5 ] && { echo "失败达到上限,停止补位"; break; }
run_bg "$t" || failed=$((failed+1)) &
while [ "$(jobs -rp | wc -l)" -ge 8 ]; do wait -n; done
done < targets.txt
wait推进策略对比
| 策略 | 特点 | 适用场景 |
|---|---|---|
| 固定批次 | 每批等最慢的任务完成 | 耗时相近、需要批间观察 |
| 滚动窗口 | 完成即补位,槽位不空闲 | 耗时差异大的大批量任务 |
| 执行者池抢占 | 按实际速度分配 | 任务粒度小、执行者动态变化 |
| 完全串行 | 最慢但最易观察 | 高风险变更的首批验证 |
滚动窗口下「总进度」比「批次序号」更有意义。用已完成数、在途数与失败数三个指标描述状态,就能判断作业是在推进还是卡住。
滚动窗口没有天然的止损点,失败会持续累积。必须同时设置失败计数上限或失败率阈值,达到后停止补位并保留现场,否则会一路运行到资源耗尽。