modrails - 流氓 ruby 进程消耗 100% cpu
Posted
技术标签:
【中文标题】modrails - 流氓 ruby 进程消耗 100% cpu【英文标题】:modrails - rogue ruby processes consuming 100% cpu 【发布时间】:2010-10-12 00:19:13 【问题描述】:我有来自 mod_rails 的 ruby 实例“流氓”——这些进程不再列在乘客状态中,并且使用 100% cpu。
除了安装 god/monit 来杀死实例之外,谁能给我一些关于如何防止这种情况的建议?我无法在日志中找到任何有用的东西。
【问题讨论】:
对我来说,这只发生在我为第一个请求重新启动 apache 时——一旦进程完成了它正在做的事情,应用程序就会运行良好。但它可能需要 10 分钟(无流量)到 3-6 小时(有流量)到达该站点 - 对我来说,这不是一个选择,但想了解发生了什么以及为什么会发生 【参考方案1】:我有一个与 Phusion Passenger 相关的 ruby 进程,它消耗了大量的 CPU,尽管它本应处于空闲状态。
我跑了之后问题就消失了
date -s "`date`"
如this thread 中所建议的那样。 (那是在 Debian Squeeze 上)
显然,这个问题与闰秒有关,并且可能会影响许多其他应用程序,如 mysql、Java 等。更多信息请参见this thread on lklm。
【讨论】:
【参考方案2】:这是乘客反复出现的问题。我已经多次看到这个问题帮助那些在轨道上运行 ruby 的人。我没有解决办法,但你可能想试试这个http://www.modrails.com/documentation/Users%20guide%20Apache.html#debugging_frozen
【讨论】:
【参考方案3】:我们在运行很长时间的 SQL 查询中看到了类似的情况。
MySQL 会终止查询,因为它们超出了长期运行限制,并且线程从未意识到查询已终止。
您可能需要检查数据库日志。
【讨论】:
它将如何在日志中体现出来?还有其他指标吗?【参考方案4】:如果您使用的是 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 上似乎还有一个项目涉及调试乘客实例,看起来很有趣,但缺少文档: http://github.com/ddollar/socket-debugger/tree/master
【讨论】:
链接失效了..有人有副本吗?以上是关于modrails - 流氓 ruby 进程消耗 100% cpu的主要内容,如果未能解决你的问题,请参考以下文章