2012-11-19 13 views
7

Sto tentando di eseguire la raccolta dei dati obsoleti fuori banda (una volta che una richiesta ha completato la risposta) nell'applicazione Ruby on Rails. Ho aggiunto il seguente al mio config.ru:Esaurimento della garbage collection della banda con Unicorn + Rack

# 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 

sto guardando il mio portale NewRelic tuttavia, e la maggior parte delle transazioni web non indicare che almeno 110-150ms viene speso in media garbage collection facendo. Unicorn :: OoobGC dovrebbe farlo fuori dallo scopo della richiesta effettiva? Se lo è, perché viene visualizzato nella transazione web? In che modo il tempo speso per la raccolta dei dati obsoleti si verifica al di fuori del contesto di una richiesta Web in modo che i tempi di risposta del cliente percepiti siano più rapidi? Il tempo di CPU speso sarà sempre lo stesso poiché deve avvenire in background, tuttavia, meglio in background rispetto al mantenimento di una pipeline di richieste.

risposta

2

Se una singola richiesta alloca un numero sufficiente di oggetti per attivare un GC, verrà comunque visualizzato il tempo gc segnalato per la richiesta, nonostante lo spostamento di un GC OOB finale con il middleware unicorno.

Con ruby ​​1.9.3 e REE è possibile eseguire il buffering di varie manopole GC per controllare la frequenza con cui viene attivato gc. Vedi Tuning the GC in Ruby 1.9.3 per esempi sull'impostazione di RUBY_HEAP_MIN_SLOTS, RUBY_GC_MALLOC_LIMIT e RUBY_FREE_MIN per un comportamento migliore nelle app di servizio a lungo termine.