8

Unicorn 具有OobGC机架中间件,可用于GC.start在一定数量的请求后运行。

Phusion Passenger 中是否有类似的东西?

4

3 回答 3

5

Phusion Passenger 4 正式引入了带外垃圾收集机制。它比 Unicorn 更灵活,允许任意工作,而不仅仅是垃圾收集。http://blog.phusion.nl/2013/01/22/phusion-passenger-4-technology-preview-out-of-band-work/

于 2013-05-05T22:59:08.080 回答
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
于 2011-09-12T18:47:44.053 回答
2

你必须修补乘客。在传递每个请求后执行 aGC.start可确保在持有客户端请求时不会发生垃圾收集。如果您想减少平均请求时间,您可能会考虑这是一个单行更改。

在 lib/phusion_passenger/abstract_request_handler.rb 中,以适当的间隔修补accept_and_process_next_request并在末尾添加调用。GC.start

请参阅此提交以获取示例(感谢@raphaelcm)。

于 2011-09-08T16:35:00.737 回答