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

Why my Laravel Queued Commands are getting slow over time on Redis queue driver?

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

我安排了主命令,它将 select 来自数据库的模型并将另一个命令排队。所以,假设我有 1000 个网站和 300 台服务器要监控,master 命令将每 15 分钟执行一次,它将在它们的特定队列(serverMonitor 和 uptimeMonitor)中添加总共 1000 个网站和 300 台服务器。

问题是,当我 start/restart 使用 Supervisor 配置的工作人员时,QueuedCommands 执行得非常快。就像他们在 1/2 时间内处理所有工作一样。随着时间的推移,比如说 24 小时,当我检查队列时,我发现有数千个无人值守的排队命令。

我有 8 个工人 运行 用于 UptimeMonitor 队列和 5 个工人 运行 用于 ServerMonitor 队列。当我 start/restart 工作人员时,UptimeMonitor 每秒处理 5-6 个排队命令,但 24 小时后,它每 2 秒只处理 1 个排队命令。

我确定我的 Supervisor 配置中没有 --sleep=x 标志。我有什么想念的吗?以前有人经历过吗?

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

八名工人争夺同一个 CPU 核心,每人将获得大约 12.5% 的核心。

每个工人都会'slow down'所以你不会得到任何好处。而且你会在这两者之间失去性能,因为 OS 将需要管理进程的调度,这意味着你会得到更多的中断和上下文切换。

有两个指标可以用来判断您是否有足够的工作人员:吞吐量和延迟。

Throughput: are you creating new jobs faster than you can handle them ? Which to me this looks the trouble that you are having. You have low throughtput.

Latency: If jobs are completed in time that you think is acceptable.

在我看来你的情况似乎是你有一个低吞吐量问题建议:

  1. 一般增加你的硬件容量(强大cpu,更多内存)。
  2. 在 AWSSQS 上排队工作人员,将工作人员分散在不同的机器上。