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

Alceu R. de Freitas Jr. glasswalk3r em yahoo.com.br
Quarta Janeiro 26 05:54:57 PST 2011


Dependendo de como você usar Threads, seu programa vai gastar mais memória ainda.

Outras técnicas é utilizar comunicação entre processos (IPC) e talvez o Memcached ou mesmo um banco de dados relacional para compartilhar as informações ao invés de manter diversas cópias em memória.

Você precisa nos mostrar o que está utilizando no seu código que está consumindo tanta memória. Só assim vamos poder ajudar. Por exemplo, quantos módulos você está carregando para rodar o programa?

[]'s
Alceu

--- Em seg, 24/1/11, Tom Mostard <capmostarda em gmail.com> escreveu:

De: Tom Mostard <capmostarda em gmail.com>
Assunto: Re: [Cascavel-pm] Perl X RAM (memória)
Para: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Data: Segunda-feira, 24 de Janeiro de 2011, 19:14

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



-----Anexo incorporado-----

_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm


      


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