为什么在测试中第一个Rails请求非常缓慢?

3
在Ruby on Rails中,当我运行rails服务器时,第一个请求似乎非常缓慢,日志显示缓慢来自视图渲染:
2017-08-14 10:24:12.707 [ 22139] [INFO ] Completed 200 OK in 18547ms (Views: 18501.6ms | ActiveRecord: 3.7ms)

我猜是因为它需要连接数据库。下一个请求当然会更快:

2017-08-14 11:01:54.937 [ 25662] [INFO ] Completed 200 OK in 765ms (Views: 714.0ms | ActiveRecord: 8.3ms)

我猜这与缓存有关,并且它已经建立了数据库连接。我尝试重新启动服务器、重启数据库、清除浏览器缓存和rake db:sessions:clear,但是在开发中我无法再次让第一个请求变慢。

接下来的事情很有趣。每一次我运行cucumber测试,第一个请求总是非常慢:

2017-08-14 11:19:52.879 [ 27729] [INFO ] Completed 200 OK in 38326ms (Views: 38306.8ms | ActiveRecord: 6.1ms)

由于未知原因,它甚至比开发时间更长。

重新启动Rails服务器和重新运行第一个请求的测试之间有什么不同,导致测试变得如此缓慢?我可以采取哪些步骤来解决这个问题?

(每次运行黄瓜测试时等待30秒并不好玩)


你在使用Spring吗?(或者类似的框架?) - Brad Werth
目前不行,过去我们没有意识到需要重启Spring服务器来解决一些奇怪的问题。 - ardavis
我不确定我们对你的设置了解得足够多,以便提供很大的帮助...如果你只运行一个无操作的测试(比如 true == true),它还是慢吗? - Brad Werth
1个回答

2

很不幸,答案与我们的代码极为孤立,但我想分享答案,以防其他人遇到类似情况。

我注意到,如果我运行rake tmp:cache:clear,浏览器中的第一个请求会再次变得非常缓慢。我调查了该命令,并发现它清除了#{Rails.root}/tmp目录。

然后我在Cucumber的env.rb中找到了这一行:

Dir.foreach("#{Rails.root}/tmp") { |f|
  FileUtils.rm_rf("#{Rails.root}/tmp/#{f}")
}

这似乎就是罪魁祸首。我不知道为什么会添加它(三年前...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接