【问题标题】:How do I track down a mod_perl memory leak?如何追踪 mod_perl 内存泄漏?
【发布时间】:2009-01-21 19:18:36
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 您可以考虑将其表述为一个具体的问题。 :)
  • 您能否发布您正在使用的操作系统的详细信息?您是否也尝试过让该过程继续进行,直到达到内存限制并且您必须重新启动服务器?基本上我想知道的是你是怎么挑出它只是这个模块的内存泄漏?
  • 您也可以考虑向 apache 人员发布错误报告。

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


【解决方案1】:

你看过优秀的Practial mod_perl和它的chapter on memory leaks吗?

【讨论】:

    【解决方案2】:

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

    当你运行这个时你会得到什么:

    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:
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        $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。是否还有其他您不知道的代码正在执行?
        • 另外 - 请编辑您的回复,使文本位于多行。
        • 我已经非常彻底地检查了 http conf 并尝试删除所有不必要的内容,但我恢复了我的更改,因此它没有反映在这里。我不知道如何使它成为多行,我会再试一次
        猜你喜欢
        • 2011-02-15
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多