[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