Rails开发模式下呈现视图速度极慢

6

在控制器中除了render 'mypage'之外没有任何操作,在视图中除了HTML之外也没有任何操作(我已经在两个地方都注释掉了所有的Ruby代码),但加载页面仍然需要超过5秒:

Completed 200 OK in 6258ms (Views: 5283.2ms | ActiveRecord: 14.6ms)

有什么建议可以改进或者优化吗?我找到的每个“解决方案”对我都没有任何影响。Rails-dev-tweaks 没有影响,更改资产调试标志也没有影响;我实际上相信这一切都发生在请求资产之前。
更新于 5 月 7 日 14:50
大家好 - 感谢回复。首先让我说一下,我已经将其缩小到了资产范围内;删除了大约半打宝石和所有资产,将页面加载时间降至第一次加载为 1.3 秒,重新加载为 ~150ms。太棒了。所以我的问题现在变成了如何正确配置像 rails-dev-tweaks 这样的宝石来使其正常运行;我似乎找不到合适的配置。我们可能有一百多个资产 - 或许更多。
回答你们的问题: 我无法复制和粘贴视图;但是,可以说它大约有 100 行 HTML、10 行 javascript,大约有 30 行 HTML 代码中有一些 Ruby 代码,但我注释掉了所有的 Ruby 代码。
我尝试过 ruby-prof - 没有给我任何真正有用的东西。
没有进行外部 HTTP 请求。
在ApplicationController中有一个before_filter,但即使将其注释掉也没有太大的区别。
我正在开发Mac OS X 10.8上的应用程序。
我使用的是Rails 3.2.13版本。
完全没有资产: 第一次页面加载:
Completed 200 OK in 3418ms (Views: 1414.9ms | ActiveRecord: 74.6ms)

刷新页面:

Completed 200 OK in 140ms (Views: 120.8ms | ActiveRecord: 2.8ms)

有趣的是,rails -v 命令需要4秒钟才能加载:
ruby-1.9.3-p327@aidin ± time rails -v
    Rails 3.2.13
    rails -v  4.10s user 0.24s system 92% cpu 4.679 total

更新2 5月7日1450

新的Relic告诉我,花费的时间非常不合理,我相信是Rails依赖(实际上是ActionPack依赖)本身:Journey:

                  Metric    Timestamp (s)   Duration (ms)   Exclusive (ms)
DashboardController#show    0.001           2,652           1917

详细页面显示给我这个文件:
journey-1.0.4/lib/journey/router.rb

而这一行:

        status, headers, body = route.app.call(env)

更新3 5月7日 @ 1509

进一步调查发现,除了删除所有资源之外,删除所有宝石可以将响应时间降至可接受的约150毫秒。将宝石放回会使响应时间从800毫秒到1500毫秒不等;显然,仅在这些宝石中就存在导致问题的原因。

如果有人认为他们可以找出哪些宝石正在引起问题,我很乐意发布Gemfile。


1
你能展示一下你的视图吗? - Raindal
是否定义了任何可能生效的 before_filter? ActiveRecord 花费了一些时间,这表明数据库实际上被访问到了一定程度。这意味着当前存在您不知道的活动。 - PinnyM
有一些性能回归,你使用的 Rails 版本是哪个?不过,我猜你需要追踪发生了什么。你尝试过像 MiniProfiler 这样的东西吗? - phoet
感谢大家的反馈!我已经更新了问题并提供了更多信息。 - eragone
当应用程序不尝试处理麻烦页面时,您的负载是多少? - mguymon
显示剩余5条评论
3个回答

3

尝试使用本地 IP 地址访问应用程序

127.0.0.1:3000

在我的情况下,这样能够使加载时间缩短 2 ~ 3 秒钟。


0

因此,加载时间通常是由资产加载或发生SQL请求引起的。

首先,让我们从资产开始:

Rails 应用程序经常出现的一个错误是开发人员加载了比实际需要更多的资产。您可以在 application.jsapplication.css 中进行一些故障排除,删除 //= require_tree .。这会加载您在 assets/stylesheets 和 assets/javascripts 下拥有的所有资产。

第二,减少 SQL 查询

您可能有许多 SQL 查询运行在控制器(!)、模型或有时视图中。这些大大降低了页面的加载时间,因为它们不断地跳到您的数据库以完成查询。

另一个提示:

您可以在 /config.ru 中添加 use Rack::Deflater,以在页面加载时执行类似于 gzip 的压缩。这帮助我加快了我的页面速度。

最后一个提示:

尝试减少您在应用程序中使用的 gem 数量。其中许多可能会节省一些时间,但每个 gem 都需要更多的 HTTP 请求来加载其资产。对于大多数 gem,您可以使用自己的代码复制它们的功能。

好的...再来一个

尽量减少生产资产。这样可以减少浏览器扫描代码的时间,因为它通过删除空格减少了行数!

希望这些有所帮助!


谢谢你的建议!我们绝对需要努力减少资产;我们已经清理了很多 SQL 查询,但总是可以再看一眼。我会研究一下 Rack::Deflater。我也肯定需要减少使用的 gem 数量。看看最新的更新 - 似乎有很多时间花在 我的 代码之外... - eragone
我明白了。你确定你没有远程加载任何资产吗?(例如jquery或其他外部文件?)此外,如果您觉得这有帮助,请+1 /向上。 - derek_duncan

0

这个问题可能已经被放弃了,但很可能是一个/etc/hosts的问题。在URL栏中输入127.0.0.1通常可以解决问题,但我注意到这并不总是有效。

在更改设置之前,断开网络连接并查看是否有帮助。如果有帮助,那么你很可能需要编辑你的/etc/hosts文件。确保它有以下这一行。

127.0.0.1        localhost

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