6

私はmodperl1.3.0とapache1.3.41perlバージョン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に増加するのを監視します。

以下の質問に答えるには:これはredhatEnterprise4.7で行っています。静的ファイル、またはまっすぐなcgi要求にヒットし、メモリが増大しないため、これとして選択されました。PerlHandler Apache :: RegistryまたはPerlRunを使用する場合、またはPerlHandlerをハンドラーであるコードにポイントするだけの場合、それらはすべてリークします。

誰かがこのようなものを見た、または何が起こっているのか知っていますか?

編集:

答えてくれてありがとう。Devel :: Cycleを使用してリークを見つけましたが、ここでの問題は、ヘッダーとステートメントを出力するためにコードを削除したことです。Perlのprint関数がリークする方法はありません(私は願っています...)。私が読んだPracticalModperlのメモリリークのセクションですが、コーディングの問題を扱っています。また、Perlの印刷機能に問題がない限り、コードではありません。

4

4 に答える 4

4

優れた実用的なmod_perlとそのメモリ リークに関する章をご覧になりましたか?

于 2009-01-22T10:15:55.303 に答える
3

あなたは print ステートメントに落ち込んでいるので、他のモジュールをロードしていないことを確信していますか? ロードしている他の誰かのコードにリークがある可能性があります。

これを実行すると何が得られますか:

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 に答える
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 に答える