X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/49f4a78240c252539c4e781c634e71a3574b43c0..77e8a16a153752b919a9153c1c9ded9834d387f7:/config/initializers/memory_limits.rb?ds=sidebyside diff --git a/config/initializers/memory_limits.rb b/config/initializers/memory_limits.rb index e1a1e07c3..b58c1f28e 100644 --- a/config/initializers/memory_limits.rb +++ b/config/initializers/memory_limits.rb @@ -1,39 +1,39 @@ # Setup any specified hard limit on the virtual size of the process -#if defined?(HARD_MEMORY_LIMIT) and Process.const_defined?(:RLIMIT_AS) -# Process.setrlimit Process::RLIMIT_AS, HARD_MEMORY_LIMIT*1024*1024, Process::RLIM_INFINITY -#end +if defined?(HARD_MEMORY_LIMIT) && defined?(PhusionPassenger) && Process.const_defined?(:RLIMIT_AS) + Process.setrlimit Process::RLIMIT_AS, HARD_MEMORY_LIMIT * 1024 * 1024, Process::RLIM_INFINITY +end # If we're running under passenger and a soft memory limit is # configured then setup some rack middleware to police the limit -if defined?(SOFT_MEMORY_LIMIT) and defined?(PhusionPassenger) +if defined?(SOFT_MEMORY_LIMIT) && defined?(PhusionPassenger) # Define some rack middleware to police the soft memory limit class MemoryLimit def initialize(app) @app = app end - + def call(env) # Process this requst status, headers, body = @app.call(env) - + # Restart if we've hit our memory limit - if resident_size > SOFT_MEMORY_LIMIT - Process.kill("USR1", Process.pid) - end - + Process.kill("USR1", Process.pid) if resident_size > SOFT_MEMORY_LIMIT + # Return the result of this request [status, headers, body] end - private + + private + def resident_size # Read statm to get process sizes. Format is # Size RSS Shared Text Lib Data fields = File.open("/proc/self/statm") do |file| fields = file.gets.split(" ") end - + # Return resident size in megabytes - return fields[1].to_i / 256 + fields[1].to_i / 256 end end