2009-01-21 39 views
6

我使用mod perl 1.3.0和apache 1.3.41 perl版本5.8.6,并且内存大小似乎每3或4次请求增长大约4k。我们正在运行的Perl脚本很简单:如何追踪mod_perl内存泄漏?

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

然而,这apache进程只是不停地生长,当我们用Apache基准踩住它。我们正在打它:

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

,我们看着进程大小约4兆到24后约20000请求的增长。

要回答以下问题: 我们正在做这个红帽企业4.7。因为我们遇到了一个静态文件,或者直接向cgi请求发送内存,所以它被单独列出。当我们使用PerlHandler Apache :: Registry或PerlRun,或者只是将PerlHandler指向某个处理程序的代码时,它们都会泄漏。

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

编辑:

感谢您的答案家伙。我已经使用了Devel :: Cycle并发现泄漏,但是这里的问题是我们已经剥离了我们的代码来打印标题和声明。 Perl中的打印功能无法泄漏(我希望....)。 Practical Modperl中的内存泄漏部分我已经阅读过,但它涉及编码问题,并且除非Perl的打印功能存在问题,否则它不是代码。

+0

你可能会考虑把它变成具体的问题。 :) – sharkin 2009-01-21 19:38:26

+0

你也可以考虑发布一个bug报告给apache人员。 – 2009-01-22 22:43:41

回答

1

如果可能的话,用Devel :: Cycle运行你的代码。机会是你在你的代码某处发生了内存泄漏,而不是专门在mod_perl中。

一旦找到内存泄漏(可能有多个),请修复它们。

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: 
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' 
}; 

看起来像我这些事情都是由阿帕奇加载。