Pergunta

Meu aplicativo RubyOnRails está configurado com o pacote usual de vira-latas por trás da configuração do Apache.Percebemos que o uso de memória do servidor web Mongrel pode aumentar bastante em determinadas operações e gostaríamos muito de poder fazer uma reinicialização dinâmica de processos Mongrel selecionados a qualquer momento.

No entanto, por razões que não vou abordar aqui, às vezes pode ser muito É importante que não interrompamos um Mongrel enquanto ele estiver atendendo a uma solicitação, então presumo que uma simples eliminação de processo não seja a resposta.

Idealmente, quero enviar ao Mongrel um sinal que diga "termine tudo o que estiver fazendo e saia antes de aceitar mais conexões".

Existe uma técnica padrão ou prática recomendada para isso?

Foi útil?

Solução

Eu fiz uma investigação um pouco mais sobre a fonte do Mongrel e descobri que o Mongrel instala um manipulador de sinal para capturar uma eliminação de processo padrão (TERM) e fazer um desligamento normal, então, afinal, não preciso de um procedimento especial.

Você pode ver isso funcionando na saída de log obtida ao matar um Mongrel enquanto ele processa uma solicitação.Por exemplo:

** 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

Outras dicas

Veja como usar o monit.Você pode reiniciar dinamicamente o mongrel com base na memória ou no uso da CPU.Aqui está uma linha de um arquivo de configuração que escrevi para um cliente meu.

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

Em seguida, você repetiria essa configuração para todas as instâncias de cluster mongrel.A linha monit_stub é apenas um arquivo vazio que o monit tenta baixar.Se não conseguir, ele também tenta reiniciar a instância.

Observação:o monitoramento de recursos parece não funcionar no OS X com o kernel Darwin.

A melhor pergunta é como evitar que seu aplicativo consuma tanta memória que exija que você reinicie os vira-latas de tempos em tempos.

www.modrails.com reduziu significativamente nosso consumo de memória

Pantanoso:

Se você tiver um processo em execução, ele será encerrado normalmente (atendendo todas as solicitações em sua fila, que deve ser apenas 1 se você estiver usando o balanceamento de carga adequado).O problema é que você não pode iniciar o novo servidor até que o antigo morra, então seus usuários entrarão na fila do balanceador de carga.O que achei bem-sucedido foi uma 'cascata' ou reinicialização contínua dos vira-latas.Em vez de parar todos e iniciar todos (portanto, enfileirar solicitações até que um vira-lata termine, pare, reinicie e aceite conexões), você pode parar e iniciar cada vira-lata sequencialmente, bloqueando a chamada para reiniciar o próximo vira-lata até que o anterior seja backup (use uma verificação HTTP real para um controlador /status).À medida que seus vira-latas rolam, apenas um de cada vez fica inativo e você está servindo em duas bases de código - se não puder fazer isso, você deve abrir uma página de manutenção por um minuto.Você deve ser capaz de automatizar isso com o capistrano ou qualquer que seja a sua ferramenta de implantação.

Então eu tenho 3 tarefas:cap:deploy - que executa o método tradicional de reiniciar tudo ao mesmo tempo com um gancho que abre uma página de manutenção e a desativa após uma verificação HTTP.cap:deploy:rolling - que faz essa cascata pela máquina (eu puxo de um iClassify para saber quantos vira-latas estão na máquina determinada) sem uma página de manutenção.cap deploy:migrations - que faz manutenção da página + migrações, já que geralmente é uma má ideia executar migrações 'ao vivo'.

Tente usar:

mongrel_cluster_ctl stop

Você também pode usar:

mongrel_cluster_ctl restart

Tem uma questão

o que acontece quando /usr/local/bin/mongrel_rails cluster::start --only 8000 é acionado?

todas as solicitações são atendidas por esse processo específico, até o fim?ou são abortados?

Estou curioso para saber se toda essa coisa de iniciar/reiniciar pode ser feita sem afetar os usuários finais...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top