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

然而,由于我不会在这里讨论的原因,有时它可能是 非常 重要的是我们在 Mongrel 服务请求时不要中断它,所以我认为简单的进程终止并不是答案。

理想情况下,我想向 Mongrel 发送一个信号,表示“完成您正在做的任何事情,然后在接受更多连接之前退出”。

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

有帮助吗?

解决方案

我对 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

其他提示

看看使用 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

然后,您可以对所有混合集群实例重复此配置。monit_stub 行只是 monit 尝试下载的空文件。如果不能,它也会尝试重新启动实例。

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

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

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

沼泽:

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

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

尝试使用:

mongrel_cluster_ctl stop

您还可以使用:

mongrel_cluster_ctl restart

有问题

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

这个特定流程是否满足了所有请求的目的?或者他们被流产了?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top