【问题标题】:Ruby process eat 100% cpu [closed]Ruby 进程吃掉 100% cpu [关闭]
【发布时间】:2011-12-25 02:40:48
【问题描述】:

当我试图从我的应用程序中注销(使用设计)时,rails 应用程序挂起并且 ruby​​ 吃掉 100% 的 CPU,在我重新启动服务器后它仍然冻结(无法加载页面)。只有当我删除并重新创建我的数据库时它才会消失。我正在使用 PostgreSQL,试图切换到 MySQL,但没有帮助。使用 mongrel(也发生在 webrick 上)。 Ruby 1.9.2,rails 3.0.9

跟踪

futex(0xe1be68, FUTEX_WAKE_PRIVATE, 1)  = 1
futex(0xe1c3fc, FUTEX_WAIT_PRIVATE, 1, NULL) = ? ERESTARTSYS (To be restarted)
--- SIGINT (Interrupt) @ 0 (0) ---
rt_sigreturn(0x2)                       = -1 EINTR (Interrupted system call)
futex(0xe1c3fc, FUTEX_WAIT_PRIVATE, 1, NULL) = 0
futex(0xe1c458, FUTEX_WAKE_PRIVATE, 1)  = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0xe1be68, FUTEX_WAIT_PRIVATE, 2, NULL) = 0

控制台输出:

Started GET "/signout" for 127.0.0.1 at 2011-11-09 10:11:13 +0200
  SQL (1.0ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"jokes"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum
  Processing by SessionsController#destroy as HTML
Redirected to http://localhost:3000/
Completed 302 Found in 1ms

我不确定那里会发生什么?

UPD* 这冻结不仅发生在注销时,它是随机发生的 :(mac 上的其他开发人员也没有这个问题,我正在运行 Ubuntu 11.10,在 10.04 上尝试过,仍然存在。

【问题讨论】:

  • 100% cpu 听起来像是某种无限循环,并且有无数可能的罪魁祸首可能导致这种情况。将模型保存在 after_save 钩子中是一个,无限重定向是另一个。这可能是其中之一,但也可能完全是其他东西(就此而言,甚至不一定是无限循环)。
  • 我检查了两次,钩子上没有无限循环
  • 你能告诉我们用户模型的模型代码吗?您给我们的信息还不足以让我们开始查明错误的来源。
  • 请看更新,我认为这与 linux 相关
  • Ruby 吃 100% 可能只意味着一件事:您的服务器是单核 :-)

标签: ruby-on-rails ruby cpu mongrel


【解决方案1】:

尝试在 development.rb 中开启 cache_classes

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 2010-10-12
    • 2021-12-22
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多