如何追踪mod_perl内存泄漏问题?

6
我正在使用与Apache 1.3.41 Perl版本5.8.6一起的mod_perl 1.3.0,每第3或4个请求内存大小似乎会增长约4k。我们正在运行的Perl脚本非常简单:
print "Content-type: text/html\n\n";  print "baby";

当我们用Apache benchmark测试时,那个Apache进程会不断增长。我们正在进行如下的测试:

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

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

回答下面的问题:

我们在redhat企业4.7上进行此操作。因为我们访问了静态文件或直接发起cgi请求,而内存不会增长。当我们使用PerlHandler Apache::Registry或PerlRun,或者只是将PerlHandler指向某个处理器代码时,它们都会泄漏。

有人见过这种情况吗?或者知道出了什么问题吗?

编辑:

谢谢大家的回答。我使用了Devel::Cycle并找到了一个泄漏,但问题在于我们已经简化了代码,只打印头和一条语句。Perl的print函数不可能泄漏(我希望如此......)。我已经阅读了《Practical Modperl》中的内存泄漏部分,但它涉及编码问题,除非有与Perl的print函数有关的问题,否则就不是代码的问题。


你可以考虑将这个问题具体化一些。 :) - sharkin
请问您能否发布一下您正在使用的操作系统的详细信息?另外,您是否尝试让进程一直运行,直到达到内存限制并不得不重新启动服务器?基本上,我想知道的是,您是如何确定这个模块存在内存泄漏问题的? - Rutesh Makhijani
您也可以考虑向Apache团队提交错误报告。 - Robert P
4个回答

4

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:

1
如果可能的话,使用Devel::Cycle运行您的代码。很有可能您的代码中存在内存泄漏问题,而不是特别与mod_perl相关。
一旦您定位到内存泄漏(可能有多个)的位置,请修复它们。

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 加载的。


检查你的httpd.conf文件。某些东西正在加载Apache::DBI和DBI模块。是否存在你没有意识到的其他代码在执行? - JDrago
另外,请编辑您的回复,使文本分成多行。 - JDrago
我已经仔细检查了http conf,并尝试删除所有不必要的内容,但我已经恢复了更改,因此这里没有反映。我无法弄清楚如何使它成为多行,我会再试一次。 - jacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接