ThinkPHP 队列超时排查:从 load 41 到稳定运行
在生产环境中,我们使用 ThinkPHP 的 think-queue 处理异步任务。近期发现服务器 load 一度飙到 41,CPU 几乎被打满。排查后发现核心原因是 supervisor 配置中缺少 --sleep 参数,并且 numprocs=5 的 5 个 worker 同时监听 33 个队列。
问题定位
通过 top 和 supervisorctl status 发现,每个 worker 都在空转轮询所有队列。没有 sleep 间隔意味着 worker 不间断地扫描 Redis,造成大量无效 CPU 消耗。
优化方案
- 为每个队列配置独立的 worker 组,避免一个 worker 监听过多队列。
- 添加
--sleep 3-5参数,让 worker 在队列为空时休眠。 - Redis 计数器在重启 worker 前用 DB 实况原子校正,防止槽位泄漏。
效果
优化后服务器 load 从 41 降至 1.5 以下,队列处理延迟也从数分钟缩短到秒级。