6

我正在使用 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 benchmark 猛击它时,那个 apache 进程只会增长和增长。我们正在使用:

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

在大约 20000 个请求之后,我们观察到进程大小从大约 4 MB 增长到 24。

回答以下问题:我们在 redhat enterprise 4.7 上执行此操作。它之所以被挑出来是因为我们遇到了一个静态文件,或者是一个直接的 cgi 请求并且内存没有增长。当我们使用 PerlHandler Apache::Registry 或 PerlRun,或者只是将 PerlHandler 指向一些作为处理程序的代码时,它们都会泄漏。

有谁见过这样的事情,或者知道发生了什么?

编辑:

谢谢你们的答案。我使用了 Devel::Cycle 并发现了一个漏洞,但这里的问题是我们已经剥离了代码以打印标题和语句。Perl 中的打印功能不会泄漏(我希望....)。我读过 Practical Modperl 中的内存泄漏部分,但它处理编码问题,而且除非 Perl 的打印功能有问题,否则它不是代码。

4

4 回答 4

4

你看过优秀的Practial mod_perl及其关于内存泄漏的章节吗?

于 2009-01-22T10:15:55.303 回答
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:
于 2009-01-22T21:29:18.453 回答
1

如果可能,请使用 Devel::Cycle 运行您的代码。您的代码中的某个地方可能存在内存泄漏,而不是特别是在 mod_perl 中。

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

于 2009-01-22T15:52:24.110 回答
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 加载的。

于 2009-01-22T22:36:41.673 回答