【问题标题】:Why are multiple Ruby processes on an EC2 server causing 100% CPU utilisation?为什么 EC2 服务器上的多个 Ruby 进程会导致 100% 的 CPU 利用率?
【发布时间】:2019-01-31 11:39:12
【问题描述】:

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

include SuckerPunch::Job 
workers 5

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

【问题讨论】:

  • 我不确定您使用的是什么应用程序服务器以及它的配置。我认为您必须配置许多工人。您必须提供有关应用服务器的更多信息(puma?passenger?unicorn?)
  • 我正在使用 Puma 应用服务器,并且我还在使用 Sucker Punch gem 进行多个后台作业
  • 那么,Puma 的配置是什么?你用了多少工人?那么sucker_punch 配置呢?看来你们俩的工人太多了
  • 我在 AWS EC2 服务器上使用默认的 PUMA 配置和默认的 Sucker-punch 配置。但是有 7 个文件正在使用吸盘打孔作业,每个文件有 5 名工人。为了提高可读性,我添加了有关问题本身的详细信息
  • 运行top -c,它会添加一个列,其中包含创建每个进程的命令的更多信息

标签: ruby-on-rails ruby ruby-on-rails-4 amazon-ec2 puma


【解决方案1】:

减少资源争用的一些方法

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

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

【讨论】:

  • 谢谢托德。您对用户空间和窃取时间的洞察有助于找到降低 CPU 利用率的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
相关资源
最近更新 更多