modrails - 流氓ruby进程消耗100%cpu

时间:2009-03-08 07:13:31

标签: ruby-on-rails ruby passenger mod-rails phusion

我从mod_rails获得ruby实例变为“流氓” - 这些进程不再列在乘客状态并且使用100%cpu。

除了安装god / monit来杀死实例之外,有人可以给我一些关于如何防止这种情况的建议吗?我无法在日志中找到任何有帮助的内容。

4 个答案:

答案 0 :(得分:11)

如果您正在使用Linux,则可以安装“strace”实用程序,以查看Ruby进程正在执行哪些操作消耗所有CPU。这将为您提供良好的低级视图。它应该在您的包管理器中可用。然后你可以:

$ sudo strace -p 22710
Process 22710 attached - interrupt to quit
...lots of stuff...
(press Ctrl+C)

然后,如果你想在中间停止进程并转储堆栈跟踪,你可以按照http://eigenclass.org/hiki.rb?ruby+live+process+introspection在Ruby中使用GDB的指南,特别是:

gdb --pid=(ruby process)
session-ruby
stdout_redirect
(in other terminal) tail -f /tmp/ruby_debug.(pid)
eval "caller"

您还可以使用ruby-debug Gem远程连接到您打开的调试套接字,如http://duckpunching.com/passenger-mod_rails-for-development-now-with-debugger中所述

Github上似乎还有一个关于调试看起来很有趣的Passenger实例的项目,但缺少文档: http://github.com/ddollar/socket-debugger/tree/master

答案 1 :(得分:4)

我有一个与Phusion Passenger相关的ruby进程,它消耗了大量的CPU,即使它应该是空闲的。

我跑完后问题就消失了

date -s "`date`"

this thread中所述。 (那是在Debian Squeeze上)

显然,问题与闰秒有关,可能会影响许多其他应用程序,如MySQL,Java等。this thread on lklm中的更多信息。

答案 2 :(得分:2)

这是乘客经常出现的问题。我已经多次看到这个问题,帮助那些用乘客在轨道上运行红宝石的人。我没有修复,但你可能想尝试这个http://www.modrails.com/documentation/Users%20guide%20Apache.html#debugging_frozen

答案 3 :(得分:2)

我们在很长时间运行的SQL查询中看到了类似的内容。

MySQL会终止查询,因为它们超出了长时间运行限制,并且线程从未意识到查询已经死亡。

您可能想要检查数据库日志。