Rails 3在Ruby 1.9.2上初始化非常缓慢。

26
我正在使用RVM来管理环境,安装了Ruby 1.9.2.p136(我认为这是最新版本)和Rails 3,创建了gemsets并运行了bundler。目前为止一切都很顺利,但是当运行命令,如generate、destroy、rake等时,Rails的初始化速度非常慢。每个命令需要大约30-45秒才能完成。如果使用Ruby Enterprise Edition或Ruby 1.8.7,则不会出现这种情况。请问为什么会这样?我正在运行Ubuntu 10.10,使用RVM,Ruby 1.9.2和Rails 3。谢谢。

这是在全新的应用程序上还是在现有的应用程序上? - Dylan Markow
1
在系统监视器(Ubuntu)中检查过了。现在使用rake db:migrate命令测试,它正在使用100%的CPU和约50MB的RAM。 - Harry
这是strace的输出。 http://shorttext.com/k6g37kpi52 - Harry
在Linux上似乎存在gettimeofday问题。也许你的内核对计时器进行了一些额外的配置? - Zepplock
没有额外的配置。这是一个干净的Ubuntu 10.10安装。带有RVM,Ruby 1.9.2和gems。 - Harry
2个回答

7
在Rails-Core上有一个关于这个问题的讨论:http://groups.google.com/group/rubyonrails-core/browse_thread/thread/88519ef5a53088a1/c01ba447c6dc0de7?lnk=raot 引用Yehuda Katz的话:
“在1.9中,C需要代码执行的一些操作会减慢速度。其中一个例子是每次require时重新检查$LOAD_PATH以确保它全部展开。这是一个应该由ruby-core解决的问题。如果还没有的话,我将在redmine上开一个工单。”
我也遇到了这个问题,$LOAD_PATH问题可能是一个潜在原因。希望能尽快修复。

1
然而,看起来这个修复是一个相当重要的修复,计划在1.9.3中进行,所以谁知道它何时会被修复!需要性能错误 - Alastair Brunton

3

尝试使用strace(在unix上)或dtruss(在mac上)跟踪您的命令(可能需要使用“sudo”)。它将向您显示进程花费时间的位置。注意它在哪里暂停。这绝对不是正常情况。


我找到了 Ruby 实例的进程 ID,然后使用 strace 进行了检查。进程日志中有很多等待进程。"[pid 2204] 04:26:08.156009 futex(0x58c1c4, FUTEX_WAIT_PRIVATE, 1015189, {0, 9842003}) = -1 ETIMEDOUT (Connection timed out)" - Harry
网络IO,你是通过IP访问数据库吗?你有正确的DNS解析器吗?尝试将所有域名切换为IP地址。你也可以运行“netstat -a”命令查看它正在尝试去哪里。 - Zepplock
目前Rails正在本地主机上运行(使用开发环境)。 - Harry
1
strace和dtruss是非常棒的诊断工具,我通过这个回复才学到了它们。谢谢Zepplock。 - Abel

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