为什么我的 Laravel 队列命令在 Redis 队列驱动程序上随着时间的推移变得越来越慢?



我正在使用 Redis 驱动程序来处理多个队列和多个队列工作线程上的多种类型的作业。例如,假设我正在制作一个监控服务,它将监控服务器的连接和网站的正常运行时间。

我计划了主命令,它将从数据库中选择模型,并将排队另一个将排队的命令。因此,假设我有 1000 个网站和 300 台服务器要监控,master 命令将每 15 分钟执行一次,它将在其特定队列中添加总共 1000 个网站和 300 台服务器(serverMonitor 和 uptimeMonitor(。

问题是,当我启动/重新启动使用主管配置的工作线程时,队列命令执行速度非常快。就像他们在 1/2 时间内处理所有工作一样。随着时间的推移,比如说 24 小时,当我检查队列时,我发现数千个无人值守的排队命令。

我有 8 个工作线程运行正常运行时间监视器队列,5 个工作线程运行服务器监视器队列。当我启动/重新启动工作线程时,UptimeMonitor 每秒将处理 5-6 个排队命令,但在 24 小时后,它每 1 秒只会处理 2 个排队命令。

我确保我的主管配置中没有--sleep=x标志。我缺少什么吗?以前有人经历过吗?

当你有忙碌的员工时,这是一个经验法则。他们将开始争夺资源。

争夺同一CPU内核的八名工人将分别获得大约12.5%的内核。

每个工人都会"放慢速度",所以你不会得到任何好处。而且您将在两者之间失去性能,因为操作系统需要管理进程的调度,这意味着您将获得更多的中断和上下文切换。

要查看是否有足够的辅助角色,可以查看两个度量值:吞吐量和延迟。

吞吐量:创建新作业的速度是否快于处理速度 ?在我看来,这看起来是你遇到的麻烦。你有低 通过普特。

延迟:如果作业在您认为可接受的时间内完成。

就像你的情况一样,在我看来你有一个低吞吐量的问题建议:

  1. 一般增加您的硬件容量(强大的CPU,更多的RAM(。
  2. 在 AWSSQS 上对工作线程进行排队,将工作线程分散在不同的计算机上。

最新更新