为什么 EC2 服务器上的多个 Ruby 进程导致 100% CPU 利用率?

Why are multiple Ruby processes on an EC2 server causing 100% CPU utilisation?

我有一个 Rails 应用程序,它在大多数时间都具有 100% CPU 的利用率。 我无法弄清楚为什么服务器上的负载如此之大。我正在使用具有默认配置的 Puma Web 服务器,并且 运行 使用 sucker-punch gem 的多个后台作业。有 7 个文件正在使用 5 个工人的 sucker punch 作业:

include SuckerPunch::Job 
workers 5

我 运行 top -i 查询并在服务器上发现以下进程 运行。我可以在服务器上看到多个 Ruby 命令。谁能告诉我这是服务器上的正常行为,还是有问题?

减少资源争用的一些方法

您的用户 space 负载很高 (~48%),因此您可能希望减少 Web 应用程序中的工作器数量,增加实例上可用的 CPU 数量,移动到Ruby 的一个版本,它具有更好的并发性和真正的多核支持(例如 Rubinius 或 JRuby),或者这些选项的某种组合。根据您的代码实际执行的操作,您可能还需要重新构建应用程序以从应用程序服务器卸载昂贵的 I/O。

此外,您的窃取时间相当高 (~41%),因此您的 EC2 实例可能已过载。只需将您的应用程序移至负载较少的实例即可释放足够的资源以减少应用程序等待时间。