【问题标题】:Ruby on Rails: what performance can I realistically aim for?Ruby on Rails:我可以真正追求什么样的性能?
【发布时间】:2011-07-22 01:49:30
【问题描述】:

我一直在使用 Ruby on Rails 3 构建应用程序,并且开始担心性能优化问题。现在我希望我的问题对于这个网站来说不是太主观,但我对事实感兴趣,而不是讨论,所以这里是:

虽然我试图让我的视图渲染得更快,但我根本不知道一件事:我应该瞄准什么?给定一个相当复杂的页面,什么加载时间是现实的?我根本没有任何参考。

我在应用程序中看到的通常是这样的:

在 397 毫秒内完成 200 次 OK(查看次数:341.1 毫秒 | ActiveRecord:17.7 毫秒)

  • 这是在我的生产服务器上,运行 Apache/Passenger。

  • 我是唯一一个(!)在该服务器上发出请求的人,它是一个根服务器(不是虚拟的),运行 Ubuntu、AMD Athlon 64 X2 5600+、4 GB RAM

  • 1234563 ),但“views”数通常>200 ms。 1234563 ) 只要我是唯一一个发出请求的人,我的加载时间就会小于 20 毫秒,而如果有很多人同时发出请求,单个服务器的加载时间只会接近 100 毫秒或更多。
  • 我的预期也是数据库请求将成为主要瓶颈,因为其余的只是相对简单的计算,没有任何真正的复杂性。我认为从数据库中获取所有对象可能需要 10 毫秒,然后运行控制器代码、构建视图等可能需要 5 毫秒。

由于我从未负责过任何生产应用程序,我不知道这种期望是否现实。所以我希望有经验的人向我指出我的现实期望应该是什么。

  • (例如,“只要您是唯一提出请求的人,几乎所有内容,但真正令人讨厌的东西都应该在 50 毫秒内呈现顶部”)
  • 或(“实际上 300 毫秒对于 RoR 应用程序来说并不罕见,即使您是唯一的用户”)
  • 或(“你在开玩笑吗?在比你的服务器更小的服务器上,我得到

再次,我希望这不是太主观,但我对 RoR 是否快速的意见并不真正感兴趣,我希望有更多经验的人提供关于平均数字和生产预期的事实RoR 应用程序。否则我根本不知道我应该在什么时候停止优化并接受我永远不会得到 10 毫秒的加载时间。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    天哪,我不确定我是不是回答这个问题的人,但由于我已经在这些水域待了足够多的时间,我可能对要看的东西有一个不完整的想法。

    首先,响应时间是相当主观的。意思是,如果它对你来说足够好,那就足够了。根据我的经验,与您的描述相似的页面似乎需要与您所描述的内容一样多的时间。所以,你在任何一个方向上都不会相差几个数量级。

    如果您想使用当前架构优化视图渲染,我认为您的下一步是here。格雷格·波拉克 (Greg Pollack) 很好地为您分解这些东西,并确保您走上正轨。您一定会缓存您的资产并微调您的堆栈。这将是您最实用的一般建议。

    如果您愿意查看您的部署架构,Ilya Grigorik 在this article 中提出了一些很好的问题,然后用Goliath 回答了这些问题。如果您的瓶颈正在加快您的服务器-客户端往返速度,那么这可能就是要采取的方法。

    我尽量关注 Aaron Patterson 所说的任何关于性能的内容,例如在 this talk 中。他将教授一般的优化思想,其中大部分是针对您的服务器端代码的。您可能会发现一些与您当前的问题有关的事情。

    今年我被MWRC 的一位前同事拉到一边,并告诉我如果这些天我不使用 JRuby 构建,我绝对是疯了。这是一种承诺,我一直拒绝做出这样的重大改变,直到我有真正痛苦的响应时间,我没有,而且听起来你也没有。然而,JRuby 现在是一个非常主流的事情,你和我可能会在未来的某个时候在某些项目中接受它。

    所以,归根结底,我认为你正处于一个敏捷应用的领域。我想我会按照呈现的顺序整理这些资源。

    【讨论】:

    • 谢谢,这篇文章很有帮助。我不能接受它,因为它没有数字,但洞察力非常有价值。
    【解决方案2】:

    不知道你在渲染什么,很难评论性能,但我敢说 200 毫秒非常高。不要忘记日志中的调试信息可能有点误导:如果您从视图中查询数据库或某些外部资源,而不是在控制器中预加载该数据,那么该时间将归因于查看渲染。

    常见的罪魁祸首:您在模型中加载 Model X,然后在视图中访问一个关联,该关联在后台触发了一堆选择。获取模型 x 的时间很短,但相关记录将显示为“查看时间”。

    换句话说,深入日志,如果它实际上是您的视图代码,则调出分析器。

    【讨论】:

      【解决方案3】:

      我在每月 20 美元的 linode 服务器上获得的查看时间

      【讨论】:

        【解决方案4】:

        我不认为您的 200 毫秒查看时间是异常的,甚至在任何方面都不算高。

        但是,您还有改进的余地。你说“(不是特别复杂,假设它是一个分页列表,包含 20 个对象,每个对象有 5 个计算属性或其他东西)”

        对我来说,这是可以预先计算的 100 个操作,并且会加快您的视图渲染时间。

        最后——渲染时间通常与用户数量没有直接关系。在大多数部署中,当一个请求进来时,它由一个进程处理然后响应。其他请求会等到第一个请求完成后再处理。

        【讨论】:

          【解决方案5】:

          尽可能使用静态内容。除此之外,尽可能在最高级别使用缓存,最好是在页面级别。当内容无法被缓存时,尝试快速将 -something-static 或可缓存的东西返回给用户。例如,您可以提供具有基本布局的静态页面和内容所属的动画繁忙图像,然后使用 JavaScript 加载动态内容。

          【讨论】:

            猜你喜欢
            • 2010-10-04
            • 2022-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-22
            • 1970-01-01
            • 1970-01-01
            • 2015-08-30
            相关资源
            最近更新 更多