Elastic Beanstalk Ruby 进程消耗 CPU

Posted

技术标签:

【中文标题】Elastic Beanstalk Ruby 进程消耗 CPU【英文标题】:Elastic Beanstalk Ruby processes consuming CPU 【发布时间】:2015-02-05 14:37:37 【问题描述】:

我已经在 Elastic Beanstalk 上部署了一个 Rails 3 应用程序近 2 年了。在大多数情况下,我没有任何问题。但是,我最近升级到了他们的新 Ruby 配置之一(运行 Ruby 2.1(Passenger Standalone)的 64 位 Amazon Linux 2014.09 v1.0.9),并且我一直在解决一个问题,即多个 Ruby 进程之一将消耗 CPU -到我的网站变得无响应的地步。我使用的是单个 m3.medium 实例,但后来我转移到了 m3.large,这只会为我赢得一些时间来手动登录 EC2 实例并终止失控进程。我会说这种情况每天发生一两次。

在迁移到新的 Ruby 配置时,我唯一遇到的问题是我必须将以下内容添加到我的 .ebextensions 文件夹中,以便 Nokogiri 可以安装(w/bundle install)...

commands:
  build_nokogiri:
    command: "bundle config build.nokogiri --use-system-libraries"

我认为这不会导致这些挂起过程,但我可能是错的。我也不想排除与 Elastic Beanstalk 升级无关的事情,但我不能考虑任何其他会导致此问题的重大更改。我意识到这不是很多信息,但是有没有人经历过类似的事情?有人对追踪这些过程的根本原因有什么建议吗?

提前致谢!

【问题讨论】:

【参考方案1】:

我能够通过 SSH 连接到我的 EC2 实例并安装/运行 gdb 来解决我失控的 Ruby 进程问题。这是一个链接 - http://isotope11.com/blog/getting-a-ruby-backtrace-from-gnu-debugger 我遵循的步骤。我之前确实必须 sudo yum install gdb。

gdb 在我的一段代码中发现了一个无限循环,该代码在日期范围内循环了几天。

【讨论】:

【参考方案2】:

既然你升级了 beanstalk 配置,我猜你也升级了 Ruby/Rails 版本。这增加了所有 gem 版本。性能问题可能源于这些更改之一(而不是硬件更改)。 因此,这将我们带入了 RoR 性能故障排除领域: 1. 检查 beanstalk 日志是否有错误。如果幸运的话,您会通过这种方式发现配置问题。给它一个小时。 2. 假设一切顺利,尝试在您的本地主机上设置完全相同的版本(乘客 + ruby​​ 2.1 + gems 版本)。如果幸运的话,您将见证同样的缓慢并能够进行调试。 3. 如果您想直接进行生产调试,我建议您安装 newrelic(或任何其他应用程序监控工具),然后在他们的仪表板中深入了解缓慢的细节。我发现它非常有用。

【讨论】:

感谢您的反馈,塔尔。我今天早上发现了这篇文章 - blog.newrelic.com/2013/04/29/…。下次我 SSH 进入并查看挂起进程时,我将尝试 gdb。

以上是关于Elastic Beanstalk Ruby 进程消耗 CPU的主要内容,如果未能解决你的问题,请参考以下文章

升级 Ruby on Python Elastic Beanstalk 实例

Amazon Elastic Beanstalk - Ruby (Rack) 应用程序无法启动

让 Ruby 服务在 Elastic Beanstalk 上运行

在 Elastic Beanstalk 上配置 Ruby 应用程序

有人知道 AWS Elastic Beanstalk 支持原生 ruby​​ 吗?

使用自定义扩展将 Ruby 应用程序部署到 Elastic Beanstalk,无法加载编译文件