对Rails应用程序的第一个请求非常慢

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

我使用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然后在via curl中发送一个假请求。 这样,您的用户永远不会看到问题。

克里斯

可能是因为你是:

  • 需要和加载一些插件和gem

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

  • 缓存您自己的页面,这只发生在第一个请求之后,除非您“加热”缓存

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

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

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

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

我不知道如何用Ruby做到这一点,甚至是否可能。 你必须想出那一个。

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

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