如何追踪mod_perl内存泄漏?

时间:2009-01-21 19:18:36

标签: perl apache memory memory-leaks mod-perl

我正在使用mod perl 1.3.0和apache 1.3.41 perl版本5.8.6,并且每3或4个请求的内存大小似乎增长大约4k。我们运行的Perl脚本只是:

print "Content-type: text/html\n\n";  print "baby";

然而,当我们用apache基准测试时,apache进程只会增长和增长。我们正在努力:

ab -n 100000 -c 1 http://localhost/search/search.cgi &> /dev/null

我们观察到,在大约20000个请求之后,进程大小从大约4兆字节增加到24。

回答以下问题: 我们在redhat enterprise 4.7上这样做。 因为我们点击了一个静态文件,或一个直接的cgi请求而内存没有增长,所以它被单独列出了。当我们使用PerlHandler Apache :: Registry或PerlRun时,或者只是将PerlHandler指向一些处理程序的代码时,它们都会泄漏。

任何人都看过这样的事情,或知道发生了什么事?

编辑:

谢谢你的回答。我使用了Devel :: Cycle并发现了泄漏,但问题是我们已经删除了我们的代码来打印标题和声明。 Perl中的打印功能无法泄漏(我希望......)。实际Modperl中的内存泄漏部分已经阅读过,但是它处理编码问题,除非Perl的打印功能存在问题,否则它不是代码。

4 个答案:

答案 0 :(得分:4)

您是否看过优秀的Practial mod_perl及其chapter on memory leaks

答案 1 :(得分:3)

由于你是打印声明,你确定你没有加载任何其他模块吗?您正在加载的其他人的代码可能存在泄漏。

运行时你会得到什么:

package My::Handler;

use strict;
use warnings 'all';
use Data::Dumper;

sub handler : method {
  my ($class, $r) = @_;

  print "content-type: text/html\n\n<plaintext>";
  print Dumper( \%INC );
}

1;# return true:

答案 2 :(得分:1)

如果可能,使用Devel :: Cycle运行代码。您可能会在您的代码中的某个位置发生内存泄漏,而不是专门针对mod_perl。

一旦找到内存泄漏 - 可能有几个 - 修复它们。

答案 3 :(得分:0)

$VAR1 = {
    'XSLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/XSLoader.pm',
    'mod_perl.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/mod_perl.pm', 
    'warnings/register.pm' => '/usr/local/lib/perl5/5.8.6/warnings/register.pm',
    'Apache/DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/Apache/DBI.pm',
    'List/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/List/Util.pm',
    'Test.pm' => '/home/jodonnell/fashion_2009//Test.pm', 
    'Apache/Server.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Server.pm', 
    'warnings.pm' => '/usr/local/lib/perl5/5.8.6/warnings.pm',
    'DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/DBI.pm',
    'Config.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Config.pm',
    'bytes.pm' => '/usr/local/lib/perl5/5.8.6/bytes.pm',
    'Carp.pm' => '/usr/local/lib/perl5/5.8.6/Carp.pm',
    'Exporter/Heavy.pm' => '/usr/local/lib/perl5/5.8.6/Exporter/Heavy.pm',
    'Scalar/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Scalar/Util.pm',
    'vars.pm' => '/usr/local/lib/perl5/5.8.6/vars.pm',
    'Exporter.pm' => '/usr/local/lib/perl5/5.8.6/Exporter.pm',
    'strict.pm' => '/usr/local/lib/perl5/5.8.6/strict.pm',
    'Apache.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache.pm',
    'constant.pm' => '/usr/local/lib/perl5/5.8.6/constant.pm',
    'overload.pm' => '/usr/local/lib/perl5/5.8.6/overload.pm',
    'AutoLoader.pm' => '/usr/local/lib/perl5/5.8.6/AutoLoader.pm',
    'Apache/Constants.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants.pm',
    'Apache/Constants/Exports.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants/Exports.pm',
    'Apache/Connection.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Connection.pm',
    'DynaLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/DynaLoader.pm', 
    'Data/Dumper.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Data/Dumper.pm'
}; 

在我看来,这些东西都是由apache加载的。