【问题标题】:First request to Rails app is very slow对 Rails 应用程序的第一次请求非常慢
【发布时间】:2010-10-28 21:30:55
【问题描述】:

对我的 Rails 应用程序的第一个请求(工作会话)总是滞后。切换到生产模式 没用。

我使用 mongrel,其他请求的处理速度可以接受。

如何让它更快?

问候

【问题讨论】:

    标签: ruby-on-rails http mongrel


    【解决方案1】:

    如果您在处理第一个请求时发布日志的内容,那么也许我们可以找出导致它如此缓慢的原因。例如,这是我第一个用户访问该站点时的日志

    Booting Mongrel (use 'script/server webrick' to force WEBrick)    
    Rails 2.1.0 application starting on http://0.0.0.0:3000    
    Debugger enabled    
    Call with -d to detach    
    Ctrl-C to shutdown server
    ** Starting Mongrel listening at 0.0.0.0:3000
    ** Starting Rails with development environment...
    /usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/mime_type.rb:66: warning: already initialized constant CSV
    ** Rails loaded.
    ** Loading any Rails specific GemPlugins
    ** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
    ** Rails signals registered.  HUP => reload (without restart).  It might not work well.
    ** Mongrel 1.1.5 available at 0.0.0.0:3000
    ** Use CTRL-C to stop.
    
    
    Processing SessionsController#new (for 127.0.0.1 at 2009-05-26 12:26:00) [GET]
      Session ID: de2acf074759026e1ed6205724f547a9
      Parameters: {"action"=>"new", "controller"=>"sessions"}
    Rendering sessions/new
    Completed in 0.00587 (170 reqs/sec) | Rendering: 0.00298 (50%) | DB: 0.00092 (15%) | 200 OK [http://localhost/]
    

    我认为 170 reqs/sec 对我们的应用程序来说很好,但其他人可能会觉得很慢。您可以从统计信息中看到,rails 提供了一半所需的时间用于呈现响应 - 在本例中为登录屏幕生成 HTML。如果这个请求需要很长时间,我的第一个调用端口将是与登录屏幕关联的视图和助手。

    如果您确实有一个系统需要很长时间才能在第一个请求上进行初始化,那么为什么不偷偷摸摸地编写自己的启动程序,该程序首先运行 rails,然后通过 curl 发送虚假请求。这样您的用户就不会发现问题。

    克里斯

    【讨论】:

    • 感谢您的提示。这是我的日志文件:pastie.org/private/ih2mpcmjpofp5jmfsvw 有时,它会持续超过 1600 毫秒来回答我的请求。我真的不知道...
    • 您使用的是什么版本的导轨?在 10367 毫秒内完成(查看:1572,DB:450)| 200 OK [localhost/search?search=stefan+] 回答第一个请求似乎需要 10 秒。我想再次搜索相同的查询“stefan”要快得多?需要多长时间才能找到不同的记录?最后搜索一个不存在的记录需要多长时间?
    【解决方案2】:

    可能是因为你是:

    • 需要并加载多个 插件和宝石

    • 建立与外部的连接 服务(然后缓存)

    • 缓存您自己的页面 在第一次请求之后发生,除非 你'温暖'缓存

    其中任何一个都会不可避免地增加第一个请求的响应时间。

    【讨论】:

      【解决方案3】:

      这可能与我们第一次在 Websphere 中启动应用程序需要很长时间的原因相同。

      在安装新版本的应用程序(或重新启动 WAS)时,WAS 必须做大量初始工作来设置容器。

      我们使用的解决方法是修改安装脚本和 WAS 启动脚本,以便它们在运行时自动浏览到应用程序(主页和选择的其他页面)。这样,第一次真正的访问是全速的。

      我不知道如何使用 Ruby 来做到这一点,甚至不知道这是否可能。你必须弄清楚这一点。

      【讨论】:

      • 有可能——你可以使用一个简单的脚本来使用 curl/wget 从所有 Rails 应用中请求一个页面来达到同样的效果。
      【解决方案4】:

      我猜您正在使用 Ferret 进行全文搜索?可能是雪貂连接需要一段时间才能初始化?当我检查您的日志时,似乎数据库和视图都需要正常的时间,但总时间仍然是 10 秒。所以我一定是别的东西,这就是为什么我猜测雪貂可能是问题所在。

      【讨论】:

        【解决方案5】:

        也许你需要调整 apache conf 中的PassengerPoolIdleTime var。将其设置为 0 以永不停止您的 rails 进程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-04
          • 1970-01-01
          • 1970-01-01
          • 2018-03-22
          • 2012-10-12
          • 1970-01-01
          • 2013-03-23
          • 1970-01-01
          相关资源
          最近更新 更多