我查找了一下,但未发现 unicorn 中类似于 gunicorn 的 max_requests 或 Apache 的 MaxRequestsPerChild 的 max-requests-per-worker 选项。
它是否存在?
如果不存在,是否有人实现了它?
我正在考虑将它放在 oobgc 所在的文件中,因为它控制着每个请求之后的情况。这样做合适吗?
问题在于我的 unicorn 工作进程越来越臃肿,垃圾收集会占用越来越多的 CPU。
我查找了一下,但未发现 unicorn 中类似于 gunicorn 的 max_requests 或 Apache 的 MaxRequestsPerChild 的 max-requests-per-worker 选项。
它是否存在?
如果不存在,是否有人实现了它?
我正在考虑将它放在 oobgc 所在的文件中,因为它控制着每个请求之后的情况。这样做合适吗?
问题在于我的 unicorn 工作进程越来越臃肿,垃圾收集会占用越来越多的 CPU。
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))
强烈建议随机化阈值,以避免一次性杀死所有工作进程。
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