[Rio-pm] Problemas com Catalyst::Engine::HTTP::Prefork

Eden Cardim edencardim em gmail.com
Quinta Dezembro 8 15:56:52 PST 2011


>>>>> "Ricardo" == Ricardo Filipo <ricardo_filipo em yahoo.com.br> writes:

    Ricardo> Caros amigos.
    Ricardo> Boa tarde.

    Ricardo> Tenho tido alguns problemas com o servidor Catalyst em nosso novo website em testes, será que alguém pode ajudar?
    Ricardo> Estou testando o Catalyst::Engine::HTTP::Prefork pra usar em produção no lugar do FastCGI.
    Ricardo> Em alguns casos o servidor caiu, deixando o processo como zumbi no sistema, sem recuperação. Então tenho que matar todos forks
    Ricardo> que sobraram na mão e levantar novamente.

Se matar todos os forks faz o zubmi ir embora, então o processo não
estava zumbi, provavelmente o pai do processo estava em wait esperando
todos os filhos terminarem.

    Ricardo> Pensei em criar uma gambiarra, um cron que verifique a cada espaço de tempo se o servidor responde e se não estiver bem dá o
    Ricardo> restart, mas queria resolver de uma forma mais canônica.

    Ricardo> Nos logs aparece o problema:

    Ricardo> Bad fork [Cannot allocate memory]
    Ricardo>   at line 212 in file /usr/local/share/perl5/Net/Server/PreFork.pm

    Ricardo> Alguém já viu isto?

Sim, isso acontece quando acaba a memória :)

    Ricardo> Estou usando Nginx como proxy apontando para o Catalyst (não é FastCGI).
    Ricardo> Acontece a mesma coisa quando tento levantar outro servidor
    Ricardo> Catalyst com o HTTP::Prefork em outra porta. Os dois caem!

"Caem" como? Nenhuma mensagem de erro?

    Ricardo> Mas olhando a carga do sistema  vemos que o perl não passa nunca de 10% da memória, apesar da CPU chegar no pico algumas vezes.
    Ricardo> Não achei nenhum bug no RT que explicasse o problema de forma stisfatória.

Certo, mas se o processo morre, como você consegue olhar a carga do
sistema? Tudo indica que durante a carga, ele está passando do limite de
memória disponível, por algum motivo qualquer.

Tem muita coisa que pode estar acontecendo. O motivo pelo qual você não
vê o perl passando de 10% é porque o fork usa copy-on-write, e como você
está pre-forkando, as assinaturas de processos recentes são minúsculas e
só vão aumentar bem mais tarde quando começarem a carregar dados na
memória. Me parece que o que está acontecendo é uma carga repentina de
dados na memória ou algum vazamento de memória.  Observa que a morte dos
processos pode estar ocorrendo por que o PreFork pode ser configurado
para ter máximos e mínimos em quantidades de processos, como de costume
na maior parte das implementações de pre-fork.

De qualquer forma, teu caso está estranho. O server cai assim que você
carrega? Cai depois de alguns acessos? Fica vivo por um tempo depois
morre sozinho? Não to conseguindo enxergar o workflow que tá levando à
falha. Se você puder publicar um log de tudo que você tá executando no
shell, seria um bom começo pra depurar o problema.

    Ricardo> A virtualização emula um  Xeon 2.66GHz rodando um kernel do Fedora 14 com 512Mb de memória, só tem o Catalyst e o Nginx
    Ricardo> rodando. Se alguém puder ajudar eu envio mais dados pelo pastebin.

Só uma nota, o uso do Catalyst::Engine::PreFork é desaconselhado hoje em
dia, o módulo está sendo mantido apenas por motivo de
retrocompatibilidade, a última versão foi de 2009. A abordagem mais
atual pro seu caso é usar plack + starman e um proxy via unix socket:

starman script/myapp.psgi --listen /tmp/starman.sock

e no nginx:

proxy_pass http://unix:/tmp/starman.sock:/caminho/da/sua/app;

observa que você pode mudar os caminhos /tmp/starman.sock e
/caminho/da/sua/app para valores quaisquer.

-- 
Eden Cardim
Software Engineer
http://bit.ly/edencardim
http://twitter.com/#!/edenc
+55 11 9644-8225


Mais detalhes sobre a lista de discussão Rio-pm