使用Unicorn + Rack耗尽垃圾收集

时间:2012-11-19 23:31:09

标签: ruby-on-rails ruby performance garbage-collection unicorn

我试图在Ruby on Rails应用程序中带外运行垃圾收集(一旦请求完成其响应)。我将以下内容添加到我的config.ru中:

# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment',  __FILE__)
begin
  require 'unicorn/oob_gc'
rescue LoadError, NameError
end
# Out-of-band GC, runs GC after every 10th request and after the response
# has been delivered.
begin
  use Unicorn::OobGC, interval=10
rescue NameError
end

run MyApp::Application

GC.start

我正在查看我的NewRelic门户网站,大多数网络交易确实表明平均花费垃圾收集至少花费110-150毫秒。 Unicorn :: OoobGC是否应该超出实际请求的范围?如果是,为什么这会出现在网络交易中?如何在垃圾收集上花费时间在Web请求的上下文之外发生,以便感知客户端响应时间更快?花费的CPU时间仍然是相同的,因为它需要在后台发生,但是,在后台比保留请求管道更好。

1 个答案:

答案 0 :(得分:2)

如果单个请求分配了足够的对象来触发GC,那么尽管使用独角兽中间件移动了最终的GC OOB,您仍会看到为请求报告的gc时间。

使用ruby 1.9.3和REE,您可以旋转各种GC旋钮,以帮助控制gc触发的频率。有关设置RUBY_HEAP_MIN_SLOTS,RUBY_GC_MALLOC_LIMIT和RUBY_FREE_MIN的示例,请参阅Tuning the GC in Ruby 1.9.3,以便在长时间运行的服务应用中获得更好的行为。