Есть ли простой способ запустить сборку мусора вне цикла запросов в 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).

Другие вопросы по тегам