在生产环境中,我们使用 ThinkPHP 的 think-queue 处理异步任务。近期发现服务器 load 一度飙到 41,CPU 几乎被打满。排查后发现核心原因是 supervisor 配置中缺少 --sleep 参数,并且 numprocs=5 的 5 个 worker 同时监听 33 个队列。

问题定位

通过 topsupervisorctl status 发现,每个 worker 都在空转轮询所有队列。没有 sleep 间隔意味着 worker 不间断地扫描 Redis,造成大量无效 CPU 消耗。

优化方案

  • 为每个队列配置独立的 worker 组,避免一个 worker 监听过多队列。
  • 添加 --sleep 3-5 参数,让 worker 在队列为空时休眠。
  • Redis 计数器在重启 worker 前用 DB 实况原子校正,防止槽位泄漏。

效果

优化后服务器 load 从 41 降至 1.5 以下,队列处理延迟也从数分钟缩短到秒级。