]> git.openstreetmap.org Git - rails.git/blob - config/initializers/memory_limits.rb
6f553aff6689fcf91da090a499e32478aa4a0796
[rails.git] / config / initializers / memory_limits.rb
1 # Setup any specified hard limit on the virtual size of the process
2 if APP_CONFIG.include?('hard_memory_limit') and Process.const_defined?(:RLIMIT_AS)
3   Process.setrlimit Process::RLIMIT_AS, APP_CONFIG['hard_memory_limit']*1024*1024, Process::RLIM_INFINITY
4 end
5
6 # If we're running under passenger and a soft memory limit is
7 # configured then setup some rack middleware to police the limit
8 if APP_CONFIG.include?('soft_memory_limit') and defined?(PhusionPassenger)
9   # Define some rack middleware to police the soft memory limit
10   class MemoryLimit
11     def initialize(app)
12       @app = app
13     end
14     
15     def call(env)
16       # Process this requst
17       status, headers, body = @app.call(env)
18       
19       # Restart if we've hit our memory limit
20       if resident_size > APP_CONFIG['soft_memory_limit']
21         Process.kill("USR1", 0)
22       end
23       
24       # Return the result of this request
25       [status, headers, body]
26     end
27   private
28     def resident_size
29       # Read statm to get process sizes. Format is
30       #   Size RSS Shared Text Lib Data
31       fields = File.open("/proc/self/statm") do |file|
32         fields = file.gets.split(" ")
33       end
34       
35       # Return resident size in megabytes
36       return fields[1].to_i / 256
37     end
38   end
39
40   # Install the memory limit checker
41   Rails.configuration.middleware.use MemoryLimit
42 end