【问题标题】:modrails - rogue ruby processes consuming 100% cpumodrails - 流氓 ruby​​ 进程消耗 100% cpu
【发布时间】:2010-10-12 00:19:13
【问题描述】:

我有来自 mod_rails 的 ruby​​ 实例“流氓”——这些进程不再列在乘客状态中,并且使用 100% cpu。

除了安装 god/monit 来杀死实例之外,谁能给我一些关于如何防止这种情况的建议?我无法在日志中找到任何有用的东西。

【问题讨论】:

  • 对我来说,这只发生在我为第一个请求重新启动 apache 时——一旦进程完成了它正在做的事情,应用程序就会运行良好。但它可能需要 10 分钟(无流量)到 3-6 小时(有流量)到达该站点 - 对我来说,这不是一个选择,但想了解发生了什么以及为什么会发生

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


【解决方案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

      【讨论】:

      • 链接失效了..有人有副本吗?
      猜你喜欢
      • 2015-02-05
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多