我正在使用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的打印功能存在问题,否则它不是代码。
答案 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加载的。