Rails独角兽 - 启动请求和到达控制器之间的延迟

16

我在我的Rails应用程序中使用独角兽(Unicorn)作为我的应用程序服务器,并试图弄清楚为什么有时候会出现一个不太寻常的(> 5秒)延迟,从请求开始到达我的控制器的时间。

这是我的production.log输出的内容:

Started GET "/search/articles.json?q=mashable.com" for 138.7.7.33 at 2015-07-23 14:59:19 -0400**
  Parameters: {"q"=>"mashable.com"}

Searching articles for keyword: mashable.com, format: json, Time: 2015-07-23 14:59:26 -0400

注意在“STARTED GET:”和“正在搜索关键字的文章”之间有7秒的延迟,这是控制器方法执行的第一件事情。

articles.json被路由到我的控制器方法“articles”,目前它只做了这个:

def articles
        format = params[:format]
        keyword = params["q"]

        Rails.logger.info "Searching articles for keyword: #{keyword}, format: #{format}, Time: #{Time.now.to_s}"

end

这是我的routes.rb文件

MyApp::Application.routes.draw do
    match '/search/articles' => 'search#articles' 
    #more routes here, but articles is the first route
end

可能是什么原因导致这种延迟呢?是因为独角兽工作进程忙碌吗?还是因为独角兽工作进程占用了过多的内存,导致系统变慢?

注意:我不认为这种延迟是由于进行任何数据库连接引起的,但我可能是错误的。 代码不需要进行数据库调用,我的数据库最大连接数为1000,通常最多只有1-2个连接。


2
可能有很多原因 - 您需要监控系统资源以及独角兽。如果没有任何设置,添加New Relic代理可能是最快/最简单的选项。 - Musannif Zahir
Puma、Passenger等也会出现这种情况吗? - adamliesko
GET请求的最后一行是什么,即Completed 200 OK in 100ms (Views: 50.0ms | ActiveRecord: 50.0ms)这一行的含义是什么? - amiuhle
你尝试过使用其他应用服务器来查看是不是只有独角兽出了问题吗? - Jeremy Rodi
这个应用程序运行在什么环境中?能分享尽可能多的细节吗?Rails环境是生产还是开发?它是否在云端?虚拟服务器的规格和所有权是什么?换句话说,环境是什么?此外,你为了监控或解决问题做了什么?当延迟发生时,之前发生了什么?例如,您是否推送了新代码以进行预处理资源?谢谢... - Richard_G
网络延迟?是不是你的客户端需要10秒钟才能完成向服务器发送请求? - EugZol
4个回答

12

三个想法:

  1. 你可能会更好地使用 Puma 而不是 Unicorn。

  2. 可能是您的系统内存不足,也可能有足够的可用内存:安装 New Relic 来排除瓶颈在哪里。

  3. 也可能是您拥有比 DB 允许的连接数更多的 Unicorn 实例,这种情况下实例必须等待其他实例断开连接才能连接。这可能表现为不规则的 5 秒延迟,而不是每次都发生。


但是在“STARTED GET”和第一个日志语句被打印之间没有进行任何数据库连接。没有发生有意义的工作。 - Henley
实际上,ActiveRecord(以及Rails)会自动管理这个问题,并且只有在第一次SQL查询时才会启动DB连接,这正是您似乎遇到问题的时候。更多信息请参见:https://devcenter.heroku.com/articles/concurrency-and-database-connections#connection-pool。因为您正在使用Unicorn,所以有许多实例在运行,如果此数字大于DB允许的连接数,则断开连接的进程将不得不等待其他进程断开连接后才能提交其第一个SQL查询。 - Tyler

7

实际上,这可能是由一个before_filter回调引起的,您应该检查它。


4
我认为这可能是由于内存不足而频繁进行垃圾回收,导致整个系统冻结。

独角兽只使用了总内存的15%,所以我怀疑那不是原因。 - Henley

3
如果这是一个生产问题,可能是由于慢客户端发送请求引起的。New Relic和Monit是不错的选择。您可以考虑向独角兽工作进程发送信号以重新启动它们,以更好地了解问题所在。
您还可以尝试在您的Unicorn配置中添加preload_app true,以加速工作进程的启动时间。

慢客户端如何引起这个问题? - Henley
这里有一些好的信息:http://www.smashcompany.com/technology/if-unix-is-good-for-unicorn-why-cant-unicorn-handle-slow-connections - CJW

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