【问题标题】:How do I gracefully shut down a Mongrel web server如何优雅地关闭 Mongrel Web 服务器
【发布时间】:2010-09-06 20:44:57
【问题描述】:

我的 RubyOnRails 应用程序是使用 Apache 配置背后的常用杂种包设置的。我们注意到,在某些操作中,我们的 Mongrel Web 服务器内存使用量可能会变得非常大,我们真的希望能够随时动态地优雅地重新启动选定的 Mongrel 进程。

但是,由于我不会在这里讨论的原因,有时我们在处理请求时不中断 Mongrel 可能非常非常重要,所以我假设一个简单的进程终止是不是答案。

理想情况下,我想向 Mongrel 发送一个信号,上面写着“完成你正在做的一切,然后在接受更多连接之前退出”。

对此是否有标准技术或最佳实践?

【问题讨论】:

    标签: ruby-on-rails ruby mongrel


    【解决方案1】:

    尝试使用:

    mongrel_cluster_ctl stop
    

    你也可以使用:

    mongrel_cluster_ctl restart
    

    【讨论】:

      【解决方案2】:

      更好的问题是如何防止您的应用消耗太多内存,以至于需要您不时重启 mongrel。

      www.modrails.com 显着减少了我们的内存占用

      【讨论】:

      • modrails 只会减少总内存占用。它不能解决内存泄漏问题,这可能是需要重新启动 mongrels 的根本原因。
      【解决方案3】:

      我对 Mongrel 源进行了更多调查,结果发现 Mongrel 安装了一个信号处理程序来捕获标准进程终止 (TERM) 并进行正常关闭,因此之后我不需要特殊程序全部。

      您可以从在处理请求时杀死 Mongrel 时获得的日志输出中看到这一点。例如:

      ** TERM signal received.
      Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
      Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
      Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application
      

      【讨论】:

      • 如果您不接受另一个,至少它会先与这个“正确”订购。
      【解决方案4】:

      看看使用monit。您可以根据内存或 CPU 使用情况动态重启 mongrel。这是我为我的客户编写的配置文件中的一行。

      check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid
          start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000"
          stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000"
      
          if totalmem is greater than 150.0 MB for 5 cycles then restart       # eating up memory?
          if cpu is greater than 50% for 8 cycles then alert                  # send an email to admin
          if cpu is greater than 80% for 5 cycles then restart                # hung process?
          if loadavg(5min) greater than 10 for 3 cycles then restart          # bad, bad, bad
          if 3 restarts within 5 cycles then timeout                         # something is wrong, call the sys-admin
      
          if failed host 192.168.106.53 port 8000 protocol http request /monit_stub
              with timeout 10 seconds
              then restart
          group mongrel
      

      然后,您将为所有 mongrel 集群实例重复此配置。 monit_stub 行只是一个 monit 尝试下载的空文件。如果不能,它也会尝试重新启动实例。

      注意:资源监控似乎不适用于带有 Darwin 内核的 OS X。

      【讨论】:

        【解决方案5】:

        有个问题

        当 /usr/local/bin/mongrel_rails cluster::start --only 8000 被触发时会发生什么?

        是否所有请求都由这个特定进程提供服务,结束了?还是他们被中止了?

        我很好奇是否可以在不影响最终用户的情况下完成整个启动/重新启动...

        【讨论】:

          【解决方案6】:

          博吉:

          如果您有一个进程正在运行,它将正常关闭(服务其队列中的所有请求,如果您使用适当的负载平衡,则该队列应仅为 1)。问题是您无法启动新服务器,直到旧服务器死亡,因此您的用户将在负载均衡器中排队。我发现成功的是杂种的“级联”或滚动重启。您可以停止然后依次启动每个 mongrel,而不是停止所有并启动它们(因此排队请求直到一个 mongrel 完成、停止、重新启动和接受连接),阻止重新启动下一个 mongrel 的调用,直到前一个是备份(对 /status 控制器使用真正的 HTTP 检查)。当您的杂种滚动时,一次只有一个停机,并且您正在跨两个代码库提供服务 - 如果您不能这样做,您应该花一分钟时间打开一个维护页面。您应该能够使用 capistrano 或任何您的部署工具自动执行此操作。

          所以我有 3 个任务: cap:deploy - 它使用一个钩子来执行传统的同时重新启动方法,该钩子放置一个维护页面,然后在 HTTP 检查后将其删除。 cap:deploy:rolling - 在没有维护页面的情况下,它会在整个机器上级联(我从 iClassify 中提取以了解给定机器上有多少杂种)。 cap deploy:migrations - 负责维护页面 + 迁移,因为“实时”运行迁移通常是个坏主意。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-25
            • 1970-01-01
            • 2011-12-12
            • 1970-01-01
            • 2011-07-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多