我正在使用Unicorn作为我的Rails应用程序的app服务器,并且我想弄清楚为什么有时在请求开始和到达我的请求之间有一个非平凡的(> 5秒)延迟控制器。
这就是我的production.log打印出来的:
div.person span, div.person img {
position:relative
}
div.person span {
z-index:1;
}
注意STARTED GET:和“搜索关键字的文章”之间有7秒的延迟,这是控制器方法的第一件事。
articles.json被路由到我的控制器方法“articles”,它现在只是这样做:
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
这是我的routes.rb
def articles
format = params[:format]
keyword = params["q"]
Rails.logger.info "Searching articles for keyword: #{keyword}, format: #{format}, Time: #{Time.now.to_s}"
end
什么可能导致这种延迟?是因为一名独角兽工人忙吗?是因为一名Unicorn工作人员占用太多内存导致系统变慢?
注意:我不相信延迟是在建立任何数据库连接,但我可能是错的。代码不需要进行数据库调用,并且我的数据库的最大连接数为1000,并且通常最多有1-2个连接。
答案 0 :(得分:12)
三个想法:
使用Puma代替Unicorn
可能是您的系统内存不足,或者可能有足够的可用内存:安装New Relic来解决瓶颈问题
也可能是您拥有的Unicorn实例多于您的数据库允许的连接数,在这种情况下,实例必须等待其他人断开才能连接。这可能表现为不规则的5秒延迟,而不是每次都发生。
答案 1 :(得分:7)
实际上,它可能是由before_filter回调引起的,你应该检查一下
答案 2 :(得分:4)
我认为这可能是因为内存不足以及频繁的垃圾收集,这会冻结整个系统。
答案 3 :(得分:3)
如果是生产问题,可能是由于客户端发送请求的速度慢。 New Relic和Monit是不错的选择。您可以考虑向Unicorn工作人员发送信号以重新启动它们以更好地理解问题。
您还可以尝试在Unicorn配置中添加preload_app true
以加快工作进程的启动时间。