独角兽的每个工人的最大请求数

时间:2011-10-14 17:26:11

标签: ruby-on-rails garbage-collection performance unicorn

我在独角兽中找到了一个max-requests-per-worker选项,类似于gunicorn的max_requests或apache的MaxRequestsPerChild。

它存在吗?

如果没有,是否有人实施过它?

我正在考虑将它放在我拥有oobgc的文件中,因为无论如何都会在每个请求之后获得控制权。听起来不错吗?

问题是我的独角兽工人变得越来越胖,垃圾收集越来越占用我的CPU。

2 个答案:

答案 0 :(得分:6)

我刚刚发布了'unicorn-worker-killer'宝石。这使您可以根据1)最大请求数和2)进程内存大小(RSS)来杀死Unicorn worker,而不会影响请求。它真的很容易使用。首先,请将此行添加到Gemfile

gem 'unicorn-worker-killer'

然后,请将以下几行添加到config.ru

# Unicorn self-process killer
require 'unicorn/worker_killer'

# Max requests per worker
use Unicorn::WorkerKiller::MaxRequests, 3072, 4096

# Max memory size (RSS) per worker
use Unicorn::WorkerKiller::Oom, (256*(1024**2)), (384*(1024**2))

强烈建议随机化阈值,以避免一次性杀死所有工人。

答案 1 :(得分:2)

Unicorn不提供最大请求。

unicorn master将重新生成任何退出的工作者,并且当receives a QUIT signal时工作人员将在当前请求结束时正常退出,这样您就可以轻松地将自己的最大请求逻辑推送到工作请求生命周期中-cycle。

使用Rails,类似于应用程序控制器中的以下内容(或者,机架中间件中的类似逻辑)

after_filter do
  @@request_count ||= 0
  Process.kill('QUIT',$$) if (@@request_count += 1) > MAX_REQUESTS
end