5

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

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

我怎样才能让它更快?

问候

4

5 回答 5

2

如果您在处理第一个请求时发布日志的内容,那么也许我们可以弄清楚是什么让它如此缓慢。例如,这是我的第一个用户访问该站点时的日志

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 发送虚假请求。这样你的用户就永远不会看到问题。

克里斯

于 2009-05-26T11:30:56.490 回答
2

可能是因为您是:

  • 需要并加载许多插件和 gem

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

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

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

于 2009-05-27T10:57:49.273 回答
1

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

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

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

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

于 2009-05-26T06:48:36.390 回答
1

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

于 2009-05-26T15:13:46.773 回答
0

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

于 2011-10-03T18:17:51.453 回答