diff options
author | Eric Wong <normalperson@yhbt.net> | 2011-04-08 13:38:11 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2011-04-21 14:50:03 -0700 |
commit | 066bbf930d023ecf61ed4af363aebadbce2c51db (patch) | |
tree | d01025a5a9e5c12567c6467656db2e5f76aa7826 | |
parent | e5c4125c348104444714b5111c90016d520461d6 (diff) | |
download | rainbows-066bbf930d023ecf61ed4af363aebadbce2c51db.tar.gz |
In case people try to do C10K, make life easier for them.
-rw-r--r-- | lib/rainbows/http_server.rb | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/rainbows/http_server.rb b/lib/rainbows/http_server.rb index 6d704f4..21c5a05 100644 --- a/lib/rainbows/http_server.rb +++ b/lib/rainbows/http_server.rb @@ -48,6 +48,32 @@ class Rainbows::HttpServer < Unicorn::HttpServer orig == m ? super(worker) : worker_loop(worker) end + def spawn_missing_workers + # 5: std{in,out,err} + heartbeat FD + per-process listener + nofile = 5 + @worker_connections + LISTENERS.size + trysetrlimit(:RLIMIT_NOFILE, nofile) + super + end + + def trysetrlimit(resource, want) + var = Process.const_get(resource) + cur, max = Process.getrlimit(var) + cur <= want and Process.setrlimit(var, cur = max > want ? max : want) + if cur == want + @logger.warn "#{resource} rlim_cur=#{cur} is barely enough" + @logger.warn "#{svc} may monopolize resources dictated by #{resource}" \ + " and leave none for your app" + end + rescue => e + @logger.error e.message + @logger.error "#{resource} needs to be increased to >=#{want} before" \ + " starting #{svc}" + end + + def svc + File.basename($0) + end + def use(*args) model = args.shift or return @use mod = begin |