Есть ли простой способ запустить сборку мусора вне цикла запросов в Passenger? - PullRequest
8 голосов
/ 03 июня 2011

Unicorn имеет OobGC промежуточное программное обеспечение для стойки, которое можно использовать для запуска GC.start после определенного числа запросов.

Есть ли аналогичные вещи в Phusion Passenger?

Ответы [ 3 ]

5 голосов
/ 06 мая 2013

В Phusion Passenger 4 официально представлен механизм внешнего сбора мусора. Он более гибкий, чем Unicorn, позволяя выполнять любую произвольную работу, а не только сборку мусора. http://blog.phusion.nl/2013/01/22/phusion-passenger-4-technology-preview-out-of-band-work/

3 голосов
/ 12 сентября 2011

Подключение к 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
2 голосов
/ 08 сентября 2011

Вы должны патчить Пассажира.Выполнение GC.start после передачи каждого запроса гарантирует, что сбор мусора никогда не будет выполняться при удержании клиентского запроса.Это однострочное изменение, которое вы можете рассмотреть, если пытаетесь сократить среднее время запроса.

В lib / phusion_passenger / abstract_request_handler.rb исправьте accept_and_process_next_request и добавьте вызов GC.start вконец с соответствующим интервалом.

См. этот коммит для примера (спасибо, @raphaelcm).

...