ruby-on-railsrubypassengermod-rails

Is there an easy way to run Garbage Collection outside of the request cycle in Passenger?


Unicorn has OobGC rack middleware that can be used to run GC.start after a certain number of requests.

Is there a similar sort of thing in Phusion Passenger?


Solution

  • Hooking into PhusionPassenger::Rack::RequestHandler#process_request() is the only mechanism I have found.

    To do this in a similar way to the Unicorn OobGC, you can use the following module:

    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
    

    and invoke it in an initializer with:

    if defined?(PhusionPassenger::Rack::RequestHandler)
      require 'passenger_oob_gc'
      PassengerOobGC.install!(%r{^/admin/}, 3)
    end