[Cascavel-pm] Perl X RAM (memória)

Tom Mostard capmostarda em gmail.com
Segunda Janeiro 24 19:14:41 PST 2011


Pessoal,

Desculpem-me a demora na resposta.
Acabei demorando de fazer testes com as dicas que vocês passaram,
estava/estou ocupado com outro projeto.
Mas fiz uns testes usando o Parallel::ForkManager. E, ao que me parece, o
problema de consumo de memória continua.
Estou querendo fazer uns testes com o threads.pm (não é o Threads.pm, que ao
que me parece, foi descontinuado).
Encontrei uns slides interessantes sobre threads.pm e processamento
paralelo, nada muito avançado, mas muito bom:
http://www.mawode.com/~waltman/talks/perl_threads.yapceu09.pdf

Assim que testar as soluções que foram sugeridas, respasso os resultados.
Só esqueci de dizer que o sistema operacional não foi otimizado para rodar
tantos processos, acho que isso é possível. Também vou tentar fazer alguma
coisa a respeito.

Abraços,

Tom

2011/1/23 Leonardo Ruoso <leonardo.ruoso em gmail.com>

> Sua máquina não está aguentando 60 processos rodando simultaneamente, não
> sei se é isso que você quer, mas ao colocar seus "filhos" em background você
> está fazendo com que todos sejam executados simultaneamente. Só que seus
> filhos são como usuários concorrentes para o sistema operacional, então você
> deve pensar como se houvesse 60 pessoas trabalhando no seu servidor
> simultaneamente, pior, todas com processos rodando ao mesmo tempo... você
> consegue imaginar 60 firefox distintos utilizando a sua máquina ao mesmo
> tempo e acessando diferentes vídeos no you tube? pode até ser que sua
> máquina aguente, mesmo assim vai concordar comigo que toda máquina tem um
> limite.
>
> Você tem consciência que seu script, do jeito que está, poderia ser escrito
> em bash, sem nenhum prejuízo. Ou não tem? É verdade que você pode fazer algo
> mais interessante/elegante com AnyEvent ou POE (são soluções que exigem um
> pouco mais de conhecimento de sintaxe e de programação do que o seu script
> transparece) pode ser um ótimo aprendizado, mas também pode ser um passo
> maior que a perna para o momento imediato... Eu não compreendi contudo se é
> um requisito rodar simultaneamente tantos scripts filhos quanto possíveis,
> nesse caso, mesmo usando fork, AnyEvent ou POE ainda haverá um limite, maior
> que usando system (bem maior), mas haverá.
>
> Sou sempre a favor de aprender a solução mais elegante, mas entendo que
> algumas vezes precisamos de um hack e pode ser que o seu hack seja colocar
> um novo while na entrada do seu while atual do qual você só sai depois de
> verificar que a máquina tem recursos disponíveis e que seu o load está
> aceitável, lembrando de colocar um sleep 30 antes do final do while interno.
> Sim, tosco, mas pode lhe dar o tempo que precisa para estudar POE e AnyEvent
> sem ninguém resmungando ao seu pé-do-ouvido...
>
> Atenciosamente,
>
> Leonardo Ruoso (CE1921JP)
>  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . .
> leonardo em ruoso.com · (11) 3522-9612 · (85) 8787-0312
> http://leonardo.ruoso.com · http://twitter.com/LeonardoRuoso
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . .
> *Leonardo Ruoso *· * *Gerente de Projetos · Analista de Sistemas
> Comunicação Social/Jornalismo - UFC/2006 · Telecomunicações - ETFCE/1998
> *Internet e inovação tecnológica deste 1996*
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> . . . .
>
>
> 2011/1/20 Tom Mostard <capmostarda em gmail.com>
>
>> Olá, pessoal!
>>
>>
>> Estou tendo um problema de memória com scripts em Perl.
>> Alguém aí teve algum problema parecido?
>>
>> Tenho um "pequeno" sistema que precisa executar vários scripts Perl em
>> paralelo.
>> Então existe um script Perl "chefe" que fica responsável por executar eles
>> com parâmetros diferentes usando system().
>>
>> O sistema acessa vários bancos de dados e a depender do banco, da tabela e
>> do campo ele executa um módulo específico.
>> Uso o MySQL em outra máquina para não abusar da memória.
>>
>> Script-chefe:
>>
>> while ( my $i < $execucoes ) # são execuções limitadas, mas por enquanto
>> são 60
>> {
>>     system( './script.pl $parametro1 > /dev/null & ' );
>> }
>>
>> Dentro do script é carregado um módulo usando require assim:
>>
>> require $ARGV[ 0 ].".pm";
>>
>> Funciona tudo certo, se rodo 20, funciona tudo normal e eles ocupam 158 MB
>> de memória.
>> Se rodo 40, eles ocupam 316 MB de memória além da memória usada pelo
>> sistema.
>> Me parece que cada script carregado usa 8 MB em média. (Isso é
>> possível/normal?)
>> Quando uso 60, nem todos os scripts são executados.
>> Existe alguma maneira de executar um script otimizando o uso de memória ou
>> vou ter que reavaliar o código?
>> Já revisei o código e eliminei arrays, variáveis de conexões com bancos
>> desnecessárias.
>> Existe algo mais que eu possa fazer?
>>
>> Abraços,
>>
>> Tom
>>
>> _______________________________________________
>> Cascavel-pm mailing list
>> Cascavel-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20110125/24ad94df/attachment.html>


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