如何正常关闭Mongrel Web服务器
我的RubyOnRails应用程序使用Apache配置背后的普通杂物包进行设置。我们注意到,在某些操作中,我们的Mongrel Web服务器内存使用量可能会变得非常大,我们非常希望能够随时动态地平稳地重启选定的Mongrel进程。
但是,由于某些原因,我将不进行讨论,所以有时在我们处理请求时不要中断Mongrel可能非常重要,因此我认为简单的进程终止并不是解决问题的办法。
理想情况下,我想向Mongrel发送一个信号,说"完成所有操作,然后在接受更多连接之前退出"。
是否有标准技术或者最佳实践?
解决方案
回答
尝试使用:
mongrel_cluster_ctl stop
我们还可以使用:
mongrel_cluster_ctl restart
回答
更好的问题是如何避免应用程序消耗过多的内存,而这又需要我们不时重新启动mongrels。
www.modrails.com大大减少了我们的内存占用
回答
我对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使用率动态地重新启动杂种。这是我为我的客户编写的配置文件中的一行。
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上不起作用。
回答
有一个问题
/ usr / local / bin / mongrel_rails cluster :: start-仅触发8000会发生什么?
这个特定过程是否满足了所有请求的要求?还是他们流产了?
我很好奇是否可以在不影响最终用户的情况下完成整个启动/重新启动...
回答
沼泽:
如果我们有一个正在运行的进程,它将正常关闭(为队列中的所有请求提供服务(如果我们使用适当的负载平衡,则该请求应仅为1))。问题是我们要等到旧服务器死亡后才能启动新服务器,这样用户才能在负载均衡器中排队。我发现成功的是mon猴的"级联"或者滚动重启。无需停止所有启动并全部启动(因此对请求进行排队,直到完成一个杂种,停止,重新启动并接受连接),我们可以先停止然后依次启动每个杂种,从而阻止重新启动下一个杂种的调用,直到上一个杂种备份(对/ status控制器使用真实的HTTP检查)。当我们遇到麻烦时,一次只能关闭一个,如果我们无法跨两个代码库进行服务,则应该花一分钟的时间来维护。我们应该能够使用capistrano或者任何部署工具将其自动化。
所以我有3个任务:
cap:deploy,它使用钩子建立传统的同时重启所有方法,该钩子会放置一个维护页面,然后在进行HTTP检查后将其删除。
cap:deploy:rolling可以在整个机器上级联(我从iClassify提取来知道给定机器上有多少杂物),而无需维护页面。
cap deploy:migrations负责维护页面+迁移,因为通常"实时"运行迁移是个坏主意。