2012-11-02 36 views
4

我无法弄清楚如何让我的独角兽工作人员在他们真正“准备好”处理请求时接受连接。我发现前几个请求很慢,然后它们急剧加速(从几秒到几百毫秒)。这个问题似乎更加复杂的是独角兽似乎在一定时间后杀死了工人,这意味着我经常面临缓慢的第一次请求的性能打击。有没有其他人看过这个或有我能做什么的想法?独角兽工作人员的第一反应速度较慢几秒

+0

请检查该https://github.com/ooyala/barkeep/issues/237可能是它会帮助你。 –

+0

你是[预加载你的应用](http://unicorn.bogomips.org/Unicorn/Configurator.html#preload_app-method)? – dbenhur

+0

,因为第一个请求还没有被缓存,并且如果你再次发送请求,你将使用来自第一个请求的缓存查询。 如果你想提高你的独角兽性能,请检查http://blog.railsonfire.com/2012/05/06/Unicorn-on-Heroku.html –

回答

6

事实证明,我们的i18n yml文件在第一次请求的视图中被延迟加载导致性能问题。只需添加以下到我的配置/ unicorn.rb似乎已经解决了这个问题:

before_fork do |server, worker| 
    # The following is highly recomended for Rails + "preload_app true" as 
    # there's no need for the master process to hold a connection. 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 

    # No need to disconnect from Redis servers--they are connected to lazily. 

    # Force translations to be loaded into memory. 
    I18n.t('activerecord') 
end 
+2

可能是更好的代码组织在rails初始化程序中执行'I18n.t('activerecord')'而不是隐藏在before_fork钩子中。当独角兽执行应用程序预加载时,初始化程序会运行前叉。 – dbenhur

+0

@dbenhur啊,很好的电话,谢谢! –

+0

谢谢!我从来没有想到会发现这一点。看起来,这并不适用于我的初始化程序。 –