在OSX上,Ruby进程一直保持在90%以上。怎么回事?

3

我有一些正在本地构建的Ruby/Rails应用程序。最近我注意到,无论我在哪个应用程序上工作,我的Ruby进程都会增加到90%以上,CPU风扇会启动,并且除非我杀死它,否则无法停止。似乎不管我在哪个应用程序上工作都是如此。有什么想法吗?有没有办法跟踪出问题所在?

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

顺便说一下,我没有任何常驻运行的任务或作业。这种CPU占用情况发生在没有服务器负载的情况下。

我的系统:

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

偶尔我会遇到这样的情况,但这是因为我的 Ruby 进程卡住了,通常是因为我在调试某些东西然后关闭了 shell/终端窗口。机器会变得很热,看起来更加缓慢。我还没有找出完整的原因,但它已经发生了足够多的次数,以至于我会运行 topps aux | grep ruby 来查看是否有意外运行的进程。回到问题本身:如果没有源代码、配置文件或 ps 转储,很难说出问题出在哪里。 - the Tin Man
我曾通过使用 Ruby 静态站点生成器 Nanoc 运行本地站点预览后的几天,遇到了与此完全相同的问题 - top 显示有两个孤立的 ruby 进程正在以 90+% 的 CPU 运行。我启动了一个本地 (Ruby) 预览服务器,然后在不使用ctrl-C 杀死本地服务器的情况下退出了VSCode。这两个流氓 Ruby 进程没有响应 kill <PID> 命令,因此我运行了 ps -ax | grep "ruby" 以确定罪犯,然后使用活动监视器强制终止了它们。虽然可以使用 kill -9 <PID> 命令,但我已经打开了 Activity Monitor。 - Dave Everitt
3个回答

4
您是否尝试打开终端窗口并运行top或打开活动监视器,然后分别运行每个应用程序,并观察您的CPU何时开始上升?topActivity Monitor都可以让您按照应用程序生成的CPU负载进行排序。使用top -o cpu并观察最高负载是否是您运行的应用程序或者可能是应用程序导致的其他一些问题。
Rails应用程序在启动时会出现峰值,但应该在等待传入连接时稳定下来。如果您有定期执行的任务,则应该看到这些任务再次导致CPU活动峰值,然后在任务结束时下降。
您使用的是MacBook Pro。您有多少RAM?也许您的应用程序正在运行低,并且需要过多地交换?这将影响您的整体系统性能,使CPU工作更加艰难,从而导致其发热。 MacBook Pro的硬盘设计用于电池效率,而不是高性能,因此,如果您正在大量使用数据库I/O,可能会导致机器发热,并且由于记录锁定或某种争用而导致应用程序等待。
有很多不同的因素会导致您的计算机和应用程序变慢,而您并没有给我们很多可用的信息,因此以上是一些我会考虑的一般性思路。

很棒的帖子。我已经用活动监视器进行了监控,但还不足以真正跟踪。我会一直保持开放状态。今天整天都是这样,我正在使用的当前应用程序没有出现任何问题。一整天都保持在稳定的0.3 CPU。我有8GB的内存,但听起来可能就是这个原因。当发生这种情况时,我注意到一般的迟缓,可能是这个原因。我会继续关注。还有什么其他的可以注意的吗?我知道我没有提供太多信息,但我想知道如何调试这些类型的问题。再次感谢。 - Jason Lynes
你成功了。一个卡住的Ruby进程。我在控制台中进行调试,陷入了一个恶性循环,关闭了控制台,然后Ruby的使用率飙升到了99%。谢谢! - Jason Lynes

3
我也注意到这个问题并且能够确定它的来源。如果我运行top -o cpu命令,然后打开另一个终端窗口并运行IRB,接着关闭窗口但不退出IRB,那么top命令会突然显示一个占用大约90% CPU 的ruby进程。如果在关闭窗口之前退出IRB,就不会出现这个占用CPU的ruby进程。所以,我们需要小心,在正确退出ruby程序之前不要关闭终端窗口。

0

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

我在FreeBSD上遇到过这个问题,这是我的解决方案。不知何故,Ruby/Rails等版本不兼容,并且它们也没有给我可以一直跟踪的错误消息。

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

我切换到了rvm(Ruby Version Manager),并停止使用系统Ruby。这是我在Ruby方面做出的最佳系统管理员举措,因为Mac OS X / Macports(我的开发机)和FreeBSD / ports(我的生产机)的Ruby版本都落后了。

我可以看到你在Mac OS X上的ruby 1.8.7 patchlevel 174 - 当前版本的patchlevel在330以上。

此外,如果您将其推送到不是Mac OS X的生产服务器,则可能通过RVM获得更好的可移植性,因为您可以在两台计算机上安装相同的Ruby、Rails和所有gem版本。


1
作为警告,请勿尝试升级苹果安装的Ruby。他们将其放置在那里供自己使用,您可能会破坏依赖于它的代码。请使用RVM或安装新版本到/usr/local/opt中。 - the Tin Man
我遇到了这个问题并且正在使用RVM,所以这个答案对我没有帮助。 - Obromios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接