Se você “serve” suas aplicações rails usando o mongrel, tome cuidado.
Conforme o uso do cluster mongrel que você possui, ele tende a consumir cada vez mais RAM.
É um aumento gradual e lento, mas ocorre. A solução é reiniciar o mongrel_cluster de vez em quando, para liberar a memória RAM acumulada. Claro, cada vez que você inicia o mongrel de novo, o primeiro acesso à sua aplicação é um pouco mais lento. Mas acho que isso é melhor do que deixar os mongréis soltos comendo sua RAM e arriscando a travar (crash) a qualquer momento. (Estou instituindo agora que o plural de mongrel é mongréis).
Para automatizar essa tarefa, podemos utilizar o monit, que nada mais é do que o seu operador-de-datacenter-automatico-tabajara. No site deles há um grande número de exemplos de configurações.
Podemos configurá-lo para checar os processos do mongrel e restartá-los caso alguma coisa esteja errada, seja um aumento no consumo de memória, seja um consumo exagerado de cpu. Obviamente, se o processo desaparecer do nada, o monit se encarrega de iniciá-lo novamente. E tudo isso com um sistema de alertas via email, um servidor http para acompanhar o sistema e uma sintaxe de configuração praticamente humana. Fantástico, não? Deixa o nagios no chinelo, fácil, fácil.
Para instalar, versão Debian:
1 | apt-get install monit |
Exemplo do meu monitrc (rodando em produção nos servers do Pagestackr):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | set daemon 30 #checa os processos a cada 30 segundos set logfile syslog facility log_daemon set mailserver localhost set mail-format { from: monit@pagestackr.com } set eventqueue #caso o servidor SMTP não esteja funcionando, guardar os alertas basedir /var/monit slots 1000 set alert email_do_responsavel@servidor.com set httpd port 2812 and use address localhost allow localhost allow admin:monit check system localhost if loadavg (1min) > 3 then alert if loadavg (5min) > 2 then alert if memory usage > 60% then alert if cpu usage (user) > 70% then alert if cpu usage (system) > 30% then alert if cpu usage (wait) > 20% then alert include /etc/monit/*.conf |
A configuração do monit é fácil de entender. Neste arquivo, configuramos o monit para checar os processos a cada 30 segundos, usar o servidor SMTP local para enviar emails de alertas, usar o servidor http na porta 2812 (é importante sempre configurar o servidor http do monit. Não se preocupe, a configuração como eu coloquei só aceita conexões locais e através do login admin/monit), e também definimos alguns alertas para a máquina em questão.
A última linha permite que a gente configure cada servico/processo separadamente.
Arquivo mongrel.conf:
1 2 3 4 5 6 7 8 | check process mongrel_8000
with pidfile /var/www/app/pagestackr/shared/pids/mongrel.8000.pid
start program = "/usr/bin/mongrel_rails cluster::start -C /etc/mongrel_cluster/pagestackr.yml --clean --only 8000"
stop program = "/usr/bin/mongrel_rails cluster::stop -C /etc/mongrel_cluster/pagestackr.yml --clean --only 8000"
if totalmem > 40 MB for 4 cycles then restart
if cpu > 60% for 4 cycles then restart
if 3 restarts within 5 cycles then timeout
group mongrel |
Aqui definimos onde está o pid do mongrel em questão. Você deve repetir a configuração para cada instância do mongrel. É importante você ter configurado um arquivo de configuração do mongrel_cluster também (no meu caso, o arquivo pagestackr.yml).
Como podemos perceber, caso a instância do mongrel ultrapasse certos valores, ela é reiniciada (e também recebemos um alerta no email). Se houver muitos reinícios consecutivos, o monit desiste e envia um alerta (isso é útil para não ocasionar um loop infinito).
Antes de iniciar o monit, e se você usa Debian, você precisa descomentar a seguinte linha do arquivo /etc/defaults/monit:
# You must set this variable to 1 for monit to start startup=1
Iniciando o monit:
monit start
Pra finalizar, se você usa o Capistrano pra efetuar o deployment do seu aplicativo no servidor, você precisa alterar as tarefas de start e stop da aplicação para “monit -g mongrel start” e “monit -g mongrel stop”.
É isso. Agora você explorar o comando “monit status” e acessar o servidor http do seu servidor para checar o monit.
Caso você tenha ficado com alguma dúvida, escreva nos comentários (logo abaixo).
Tags: deploy, mongrel, monit, pagestacker, rails
3 Comments
1 George Guimarães wrote:
Pequena correção.
Para iniciar os mongreis, use “monit -g mongrel start all”.
Para parar, “monit -g mongrel stop all”
2 Rodrigo Patriota wrote:
EU estou testando o monit e não consigo acessar via browser de outras maquinas, apenas da maquina que está rodando o monit. Abaixo segue meu arquivo monitrc.
set daemon 60
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format { from: monit@server1.example.com }
set alert root@localhost
set httpd port 2812 and
# use address localhost
allow localhost
allow admin:monit
check process sshd with pidfile /var/run/sshd.pid
start program “/etc/init.d/ssh start”
stop program “/etc/init.d/ssh stop”
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
3 George Guimarães wrote:
Rodrigo:
Se você comentar a linha “allow localhost”, você conseguirá acessar o servidor http.
Mas fique atento. Qualquer um que saiba o login admin:monit conseguirá acessar também! Fica esperto com isso.