Есть ли простой способ запустить сборку мусора вне цикла запросов в Passenger?
Unicorn имеет промежуточное ПО для стойки OobGC, которое можно использовать для запуска GC.start
после определенного количества запросов.
Есть ли подобные вещи в Phusion Passenger?
3 ответа
Вцепляясь в PhusionPassenger::Rack::RequestHandler#process_request()
это единственный механизм, который я нашел.
Чтобы сделать это аналогично Unicorn OobGC, вы можете использовать следующий модуль:
module PassengerOobGC
def self.install!(path, interval = 5)
self.const_set :OOBGC_PATH, path
self.const_set :OOBGC_INTERVAL, interval
@@oob_nr = interval
PhusionPassenger::Rack::RequestHandler.send :include, self
end
def self.included(base)
base.send :alias_method_chain, :process_request, :gc
end
def process_request_with_gc(env, *args)
process_request_without_gc(env, *args)
if OOBGC_PATH =~ env["PATH_INFO"] && ((@@oob_nr -= 1) <= 0)
@@oob_nr = OOBGC_INTERVAL
GC.start
end
end
end
и вызвать его в инициализаторе с помощью:
if defined?(PhusionPassenger::Rack::RequestHandler)
require 'passenger_oob_gc'
PassengerOobGC.install!(%r{^/admin/}, 3)
end
Phusion Passenger 4 официально представляет механизм сбора мусора. Он более гибкий, чем Unicorn, позволяя выполнять любую произвольную работу, а не только сборку мусора. http://blog.phusion.nl/2013/01/22/phusion-passenger-4-technology-preview-out-of-band-work/
Вы должны исправить Пассажира. Делать GC.start
после того, как каждый запрос был передан, гарантирует, что сборка мусора никогда не происходит при удержании запроса клиента. Это изменение в одну строку, которое вы можете рассмотреть, если пытаетесь сократить среднее время запроса.
В lib / phusion_passenger / abstract_request_handler.rb патч accept_and_process_next_request
и добавить GC.start
звонок в конце, с соответствующим интервалом.
Посмотрите этот коммит для примера (спасибо, @raphaelcm).