Как отследить утечку памяти mod_perl? - PullRequest
6 голосов
/ 21 января 2009

Я использую мод Perl 1.3.0 с Apache 1.3.41 Perl версии 5.8.6, и объем памяти, кажется, увеличивается примерно на 4 КБ каждый 3-й или 4-й запрос. 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 запросов.

Чтобы ответить на вопрос ниже: Мы делаем это на Redhat Enterprise 4.7. Это было выделено как это, потому что мы попали в статический файл, или прямой запрос cgi, и память не растет. Когда мы используем PerlHandler Apache :: Registry или PerlRun или просто указываем PerlHandler на какой-то код, который является обработчиком, тогда все они просочились.

Кто-нибудь видел что-нибудь подобное или знает, что происходит?

EDIT:

Спасибо за ответы, ребята. Я использовал Devel :: Cycle и обнаружил утечку, но проблема здесь в том, что мы сократили наш код до печати заголовка и оператора. В Perl нет функции печати (я надеюсь ....). Я прочитал раздел об утечке памяти в Practical Modperl, но он имеет дело с проблемами кодирования, и опять же, если нет проблемы с функцией печати Perl, это не код.

Ответы [ 4 ]

4 голосов
/ 22 января 2009

Вы взглянули на превосходную Practial mod_perl и ее главу об утечках памяти ?

3 голосов
/ 23 января 2009

Поскольку вы дошли до заявления о печати, вы уверены, что не загружаете какие-либо другие модули? Возможно, имеется утечка в чужом коде, который вы загружаете.

Что вы получаете, когда запускаете это:

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:
1 голос
/ 22 января 2009

Если возможно, запустите ваш код с Devel :: Cycle. Скорее всего, у вас есть утечка памяти где-то в вашем коде , а не в mod_perl конкретно.

Как только вы обнаружили утечки памяти (их может быть несколько), исправьте их.

0 голосов
/ 23 января 2009
$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.

...