quinta-feira, 15 de julho de 2010

WWW::Mechanize - problemas com 'memory leak'

Estava no trabalho tentando resolver um problema a quase três dias. Tratava-se de um spider que estava consumindo até 8GB de memória do servidor. O engraçado é que ele não fazia isso antes, mas enfim... O fato é que ele passou a se comportar assim.

Normalmente os parsers são culpados por problemas de 'memory leak' ( ou vazamento de memória ). Então concentrei meus esforços para descobrir em que ponto do spider estava gerando o leak, mas a única coisa que consegui foi 'atrasar' o problema. O parser que eu estava usando é o HTML::TreeBuilder::XPath, e eu já tive problema de 'memory leak' com ele. Logo parecia ser um bom 'alvo'.

Finalmente depois de quase três dias, eu resolvi descartar o parser e procurar outros culpados, foi quando me caiu a ficha... O agente poderia ser o culpado. Claro! Agora fazia sentido, mesmo porque lembrando dos monitoramentos das iterações, normalmente mem. subia quando alguma requisição era feita... :P .

O módulo que eu usei para ser o agente no caso foi o maravilhoso WWW::Mechanize. Então comecei a procurar referências no google e logo descobri várias pessoas tendo o mesmo problema. A solução, felizmente, é bem simples. Apenas re-instancie o módulo dentro das iterações e pronto!!! Problema resolvido!

Mas o que me deixou fulo foi o tempo que levei para descobrir. Muito tempo mesmo! Isso me deixou tão chateado, que resolvi que vou encontrar uma maneira de observar o problema mais eficientemente, e quando conseguir, vou escrever um módulo e um artigo.

Cheers!

Nenhum comentário: