max-requests-per-worker in unicorn

5

我查找了一下,但未发现 unicorn 中类似于 gunicorn 的 max_requests 或 Apache 的 MaxRequestsPerChild 的 max-requests-per-worker 选项。

它是否存在?

如果不存在,是否有人实现了它?

我正在考虑将它放在 oobgc 所在的文件中,因为它控制着每个请求之后的情况。这样做合适吗?

问题在于我的 unicorn 工作进程越来越臃肿,垃圾收集会占用越来越多的 CPU。

2个回答

6
我刚刚发布了 'unicorn-worker-killer' gem。这使您能够基于 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))

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


2
翻译如下:

Unicorn不提供max-requests选项。

当一个worker退出时,unicorn主进程会重新生成一个worker。当一个worker 接收到QUIT信号 时,它会优雅地结束当前请求并退出,因此您可以轻松地将自己的max request逻辑整合到worker的请求生命周期中。

对于Rails应用程序,您可以在应用程序控制器中添加以下内容(或者在Rack中间件中添加类似的逻辑):

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

你确定 @request_count 是正确的吗?也许应该是 @@request_count 吧?(难道不是每个请求都有一个新的 Rails 控制器实例,而不是只有一个 Rack 中间件被实例化一次然后调用吗?) - Tim Diggins
@TimDiggins 很好的观点,我已经编辑了答案以使用类变量。当时我实际上没有测试上面的片段,但是Rails控制器确实为每个请求实例化。实践中,无论如何我都会使用中间件 :) - dbenhur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接