【问题标题】:max-requests-per-worker in unicorn独角兽中每个工人的最大请求数
【发布时间】:2011-10-14 17:26:11
【问题描述】:

我在 unicorn 中寻找,但没有找到类似于 gunicorn 的 max_requests 或 apache 的 MaxRequestsPerChild 的 max-requests-per-worker 选项。

它存在吗?

如果没有,有没有人实现过?

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

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

【问题讨论】:

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


    【解决方案1】:

    我刚刚发布了“unicorn-worker-killer”gem。这使您能够根据 1) 最大请求数和 2) 进程内存大小 (RSS) 杀死 Unicorn 工作者,而不会影响请求。它真的很容易使用。首先,请将此行添加到您的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 不提供最大请求数。

      unicorn master 将重新生成任何退出的 worker,并且 worker 将在当前请求结束时优雅退出 receives a QUIT signal,因此您可以轻松地将自己的最大请求逻辑滚动到您的 worker 请求生命周期中.

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

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

      【讨论】:

      • 您确定@request_count - 不应该是@@request_count 吗? (不是有new instance of a rails controller per request,而不是Rack middleware,它只实例化一次然后called。)
      • @TimDiggins 好点,我已经编辑了使用类 var 的答案。当时我并没有实际测试上面的 sn-p,但确实为每个请求实例化了 rails 控制器。在实践中我无论如何都会使用中间件:)
      猜你喜欢
      • 1970-01-01
      • 2014-08-04
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      相关资源
      最近更新 更多