2009-01-21 36 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' 
}; 

看起來像我這些事情都是由阿帕奇加載。