【问题标题】:Ruby processes on OSX keep going above 90%. What's up?OSX 上的 Ruby 进程保持在 90% 以上。这是怎么回事?
【发布时间】:2011-04-14 20:25:57
【问题描述】:

我在本地构建了一些 Ruby/Rails 应用程序。我最近注意到,无论我在开发哪个应用程序,我的 Ruby 进程都会构建到 90+%,CPU 风扇会启动,除非我杀死这个傻瓜,否则不会停止它。我正在开发哪个应用程序似乎并不重要。有任何想法吗?有什么方法可以跟踪问题所在?

我在 Mongrel、Apache/Passenger 和 POW 上运行了这些应用程序,每次都得到相同的结果。

顺便说一句,我没有任何工作或任务不断运行。这种 CPU 占用是在没有服务器被击中的情况下发生的。

我的系统:

Ruby:ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] 导轨:导轨 3.0.4 OSX 10.6.7,MBP 2.53 GHz Core 2 Duo

【问题讨论】:

  • 偶尔我会看到类似的东西,但这是因为我有一个卡住的 Ruby 进程,通常是因为我在调试某些东西然后关闭了 shell/终端窗口。机器会很热并且看起来更迟钝。我还没有弄清楚整个原因,但它发生的次数已经够多了,我执行topps aux | grep ruby 来查看是否有意外发生。回到问题:没有源文件或配置文件或ps 转储,很难说可能出了什么问题。
  • 在使用 Ruby 静态站点生成器 Nanoc 运行本地站点预览后,我有完全 - top 显示两个孤立的 ruby​​ 进程以 90+% 的 CPU 运行。我已经启动了一个本地(Ruby)预览服务器,然后退出 VSCode 而不首先使用 ctrl-C 来终止本地服务器。两个流氓 Ruby 进程没有响应 kill <PID>,所以运行 ps -ax | grep "ruby" 来识别罪魁祸首,然后使用 Activity Monitor 强制他们两个。本来可以使用kill -9 <PID>,但活动监视器已打开。

标签: ruby-on-rails ruby macos cpu


【解决方案1】:

我也注意到了这一点并且能够精确定位它。如果我运行 top -o cpu,然后打开另一个终端窗口并运行 IRB,然后关闭终端窗口而不退出 IRB,然后突然top 显示了一个大约 90% CPU 的 ruby​​ 进程。如果我做同样的实验,但在关闭窗口之前退出 IRB,就没有 90% 的 ruby​​ hog。

因此,显然我们需要小心不要关闭终端窗口,除非我们已正确退出 ruby​​ 程序。

【讨论】:

    【解决方案2】:

    您是否尝试过打开终端窗口并运行top,或者打开Activity Monitor,然后单独运行每个窗口并查看您的CPU 何时开始攀升? topActivity Monitor 都可以让您按应用程序生成的 CPU 负载进行排序。使用top -o cpu 并观察负载最高的是您运行的应用程序,还是应用程序导致运行的其他东西。

    Rails 应用程序在启动时会出现峰值,但在等待传入连接时应该稳定下来。如果您有它正在执行的周期性任务,您应该会看到这些导致 CPU 活动再次激增,然后在任务结束时下降。

    您使用的是 MacBook Pro。你有多少内存?也许您的应用程序运行不足并且不得不更换太多?这会影响您的整体系统性能,使 CPU 更加努力地工作,从而导致它变热。 MacBook Pro 的硬盘是为提高电池效率而不是高性能而设计的,因此,如果您使用大量数据库 I/O 对硬盘造成影响,您可能会加热机器并导致应用程序因记录锁定而等待或某种争论。

    有很多不同的因素会导致您的机器和应用程序变慢,而您并没有真正为我们提供很多工作,所以这些是我要研究的一些一般想法。

    【讨论】:

    • 很棒的帖子。我已经使用活动监视器进行了监控,但还不足以真正跟踪。将保持开放。今天一整天了,我当前使用的应用程序没有出现任何问题。一整天都在稳定的0.3 CPU。我有 8 gigs ram,但这听起来像是可能发生的事情。当这种情况发生时,我注意到普遍的迟缓,可能就是这样。会留意的。我还能注意什么?我知道我没有给出太多,但我想知道如何调试这些类型的问题。再次感谢。
    • 你成功了。一个卡住的 Ruby 进程。我在控制台中调试,进入一个讨厌的循环,关闭控制台,红宝石直接射到 99%。谢谢!
    【解决方案3】:

    这可能更像是一个建议而不是一个答案,因为我不知道它是否涵盖了您的问题,但只需几分钟,您可能想尝试一下。

    我在 FreeBSD 上遇到过这个问题,这是我的解决方案。不知何故,Ruby / Rails / etc 的版本彼此不兼容,而且它们也没有给我错误消息,我总是可以追查。

    我确定您正在这样做,但请确保您的捆绑包始终是最新的。

    我切换到 rvm(Ruby 版本管理器),并完全停止使用系统 Ruby。总的来说,这是我使用 Ruby 做出的最好的系统管理员操作,因为 Mac OS X / Macports(我的开发机器)和 FreeBSD / ports(我的生产机器)在 Ruby 版本中远远落后。

    我可以看到您在 Mac OS X 上处于 ruby​​ 1.8.7 补丁级别 174 -- 当前版本的补丁级别在 330 或以上。

    此外,如果您要推送到不是 Mac OS X 的生产服务器,那么您可能会使用 RVM 获得更好的可移植性,因为您可以在两者上安装相同版本的 Ruby、Rails 和所有 gem机器。

    【讨论】:

    • 请注意:不要尝试升级 Apple 安装的 Ruby。他们把它放在那里供他们使用,你可以破坏依赖它的代码。使用 RVM 安装新版本,或安装到 /usr/local/opt
    • 我有这个问题并且正在使用 RVM,所以这个答案对我没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 2016-04-28
    • 1970-01-01
    • 2014-04-22
    • 2011-07-06
    • 1970-01-01
    • 2019-12-19
    • 2013-07-28
    相关资源
    最近更新 更多