【发布时间】:2010-10-28 21:30:55
【问题描述】:
对我的 Rails 应用程序的第一个请求(工作会话)总是滞后。切换到生产模式 没用。
我使用 mongrel,其他请求的处理速度可以接受。
如何让它更快?
问候
【问题讨论】:
标签: ruby-on-rails http mongrel
对我的 Rails 应用程序的第一个请求(工作会话)总是滞后。切换到生产模式 没用。
我使用 mongrel,其他请求的处理速度可以接受。
如何让它更快?
问候
【问题讨论】:
标签: ruby-on-rails http mongrel
如果您在处理第一个请求时发布日志的内容,那么也许我们可以找出导致它如此缓慢的原因。例如,这是我第一个用户访问该站点时的日志
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 发送虚假请求。这样您的用户就不会发现问题。
克里斯
【讨论】:
可能是因为你是:
需要并加载多个 插件和宝石
建立与外部的连接 服务(然后缓存)
缓存您自己的页面 在第一次请求之后发生,除非 你'温暖'缓存
其中任何一个都会不可避免地增加第一个请求的响应时间。
【讨论】:
这可能与我们第一次在 Websphere 中启动应用程序需要很长时间的原因相同。
在安装新版本的应用程序(或重新启动 WAS)时,WAS 必须做大量初始工作来设置容器。
我们使用的解决方法是修改安装脚本和 WAS 启动脚本,以便它们在运行时自动浏览到应用程序(主页和选择的其他页面)。这样,第一次真正的访问是全速的。
我不知道如何使用 Ruby 来做到这一点,甚至不知道这是否可能。你必须弄清楚这一点。
【讨论】:
我猜您正在使用 Ferret 进行全文搜索?可能是雪貂连接需要一段时间才能初始化?当我检查您的日志时,似乎数据库和视图都需要正常的时间,但总时间仍然是 10 秒。所以我一定是别的东西,这就是为什么我猜测雪貂可能是问题所在。
【讨论】:
也许你需要调整 apache conf 中的PassengerPoolIdleTime var。将其设置为 0 以永不停止您的 rails 进程。
【讨论】: