267322487_db98d4515c1.jpgSe 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: , , , ,