Laravel - 队列工作者,高 CPU

djt*_*djt 5 php amazon-sqs amazon-web-services supervisord laravel

我有一个 Laravel 应用程序(在 Forge 上),它正在向 SQS 发布消息。然后,我在 Forge 上有另一个盒子,它正在运行 Supervisor 和队列工作人员,这些工作人员正在使用来自 SQS 的消息。

现在,我只有一个守护进程工作者处理来自 SQS 的特定数据管。当消息出现时,确实需要一些时间来处理 - 30 到 60 秒不等。盒子上的内存使用情况很好,但 CPU 几乎立即飙升,然后一切似乎都变得更慢。

有什么办法可以处理这个问题吗?我是否应该分派许多较小的工作(可以由多个工人使用)而不是一项不能在工人之间分配的大型工作?

另外,我注意到 Supervisor 仅使用我的两个核心之一。有什么办法让它同时使用吗?

Kee*_*asa 2

只要提供扩展,内存密集型应用程序是可以管理的,但 CPU 峰值是很难管理的,因为它发生在一个核心内,如果发生这种情况,有时您的服务器甚至可能会被沙箱化。

为了回答你的问题,我看到两种可能的方法来解决你的问题。

  1. 并发编程。保持原样,看看是否可以并行化更大的任务。(参见这个)。如果支持,则并行化代码以确保每个核心处理大型任务的特定部分。最后,将结果收集到一个协调核心中并组装最终结果。(另外:如果考虑 GPU 编程,这可以有效地完成)
  2. 分派较小的工作(如问题中给出的):如果您可以管理多个工作人员处理较小的任务,并且最后有一种机制可以将所有事情协调在一起,那么这是一个好方法。这可以被安排为主从设置。这将使一切变得容易(因为并行化问题有点困难),但您需要将所有事情协调在一起。