7

Ich versuche, Garbage Collection Out-of-Band (sobald eine Anfrage ihre Antwort fertiggestellt hat) in meiner Ruby on Rails-Anwendung auszuführen. Ich habe folgendes meine config.ru:Out-of-Band-Garbage Collection mit Unicorn + Rack ausgeführt

# 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 

ich aber an meinem NewRelic Portal suchen, und die meisten Web-Transaktionen deuten, dass zumindest 110-150ms im Durchschnitt tun Garbage Collection ausgegeben wird. Soll Unicorn :: OoobGC dies außerhalb des Rahmens der eigentlichen Anfrage tun? Wenn ja, warum wird dies in der Web-Transaktion angezeigt? Wie kann ich die Zeit für die Garbage Collection außerhalb des Kontexts einer Webanfrage verbringen, sodass die Antwortzeiten der Clients schneller sind? Die aufgewendete CPU-Zeit ist immer noch dieselbe, da sie im Hintergrund ausgeführt werden muss, jedoch im Hintergrund besser, als eine Anfrage-Pipeline zu halten.

Antwort

2

Wenn eine einzelne Anforderung genügend Objekte zum Auslösen eines GC zuweist, wird immer noch die GC-Zeit für die Anforderung angezeigt, obwohl ein endgültiger GC OOB mit der Unicorn-Middleware verschoben wurde.

Mit Ruby 1.9.3 und REE können Sie verschiedene GC-Regler drehen, um zu steuern, wie oft gc ausgelöst wird. Beispiele für das Festlegen von RUBY_HEAP_MIN_SLOTS, RUBY_GC_MALLOC_LIMIT und RUBY_FREE_MIN finden Sie unter Tuning the GC in Ruby 1.9.3 für ein besseres Verhalten in lang laufenden Serviceanwendungen.