8

我们有一个大的 Rails 应用程序,几天后,我们的 ruby​​ 进程似乎一个接一个地阻塞在一个循环中并占用 100% 的 CPU,直到乘客服务器死亡并引发 502 错误。

您知道找出原因的最佳方法吗?

我尝试过 New Relic,但它只是性能方面的东西,而且我们的错误太多,无法猜测问题出在哪里。(我们每天有很多请求和很多 UTF-8 BSON 错误,因为我们使用的是 UTF-8 url)

使用:

  • 带有 Ruby 1.9.2p290 的 Rails 3.2.6
  • 乘客 3.0.13
  • MongoDB 2.0.1 与 Mongoid 2.4.11
  • Nginx
  • FreeBSD 8.2
4

1 回答 1

8

找出 ruby​​ 卡在哪里的一种方便方法是附加gdb到正在运行的进程和call rb_backtrace(). 这会将当前堆栈跟踪打印到 stderr,这很可能被定向到日志文件。这是我在博客上找到的简短介绍。堆栈跟踪应该可以帮助您定位您的进程卡在哪里,并允许您通过代码检查或通过在关键代码路径周围添加日志工具来弄清楚发生了什么。

Aman Gupta 有一个 gdb 到 ruby​​ 钩子库gdb.rb我发现有时很方便。

于 2012-11-13T23:09:12.867 回答