2012-11-19 51 views
7

我試圖在我的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-150ms花費平均在做垃圾回收。 Unicorn :: OoobGC是否應該在實際請求的範圍之外做到這一點?如果是這樣,爲什麼會在網絡交易中出現?我如何花費在垃圾收集上的時間發生在Web請求的上下文之外,以便感知的客戶端響應時間更快? CPU花費的時間仍然是相同的,因爲它需要在後臺進行,但是,在後臺比保留請求管道更好。

回答

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以獲得長時間運行的服務應用程序中更好的行爲。