celery -A app beat -S redbeat.RedBeatScheduler celery -A app worker -Q beat -c 2 -n beat@%h celery -A app worker -Q default -c 8 -n default@%h
每天 9 点整批量任务启动,接口 P99 从 200 毫秒涨到 4 秒,持续 6 分钟,worker 的 CPU 在整点前后直接到 100%。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,beat 投递的定时任务和用户触发的任务进的是同一个队列,worker 数量固定,整点时定时任务把并发全占满。
「定时与队列混用」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:beat 的调度队列单独命名 用独立的 worker 消费;给定时任务的 worker 设较低并发 留出余量;确认 beat 只有一个实例在跑 避免重复投递;整点前后看接口 P99 确认不再抖动。
改完只确认一件事:9 点整批量任务照常执行 接口 P99 维持在 300 毫秒以内。
