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

Ale*_*x L 4 performance garbage-collection ruby-on-rails unicorn

我找到了,但没有找到,独角兽的max-requests-per-worker选项类似于gunicorn的max_requests或apache的MaxRequestsPerChild.

它存在吗?

如果没有,有人实施了吗?

我正在考虑把它放在我有oobgc的文件中,因为无论如何,它会在每个请求之后得到控制权.那个听起来是对的吗?

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

Kaz*_*hta 6

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

gem 'unicorn-worker-killer'
Run Code Online (Sandbox Code Playgroud)

然后,请将以下行添加到您的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))
Run Code Online (Sandbox Code Playgroud)

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


dbe*_*hur 2

Unicorn 不提供最大请求数。

unicorn master 将重新生成任何退出的工作线程,并且当接收到QUIT 信号时,工作线程将在当前请求结束时优雅退出,因此您可以轻松地将自己的最大请求逻辑滚动到工作线程请求生命周期中。

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

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