この単純な PSGI アプリケーション (app.psgi) があります。
use strict;
use warnings;
my $app = sub {
my $mem = `ps -o rss= -p $$`;
$mem =~ s/^\s*|\s*$//gs;
return [ 200, [ 'Content-Type' => 'text/text' ], [ $mem ]];
};
1000 回以上のリクエストがあり、メモリ使用量が増加しました。サーバーの起動方法に応じて、次のようになりました。
plackup
- メモリ使用量は最初の 3 つのリクエストで上昇し、次の 997 リクエストまで一定のままですplackup -r
- メモリ使用量が (リクエストごとではなく) ランダムに 4k 増加しています。starman
- 上記のように、メモリ使用量はランダムに 4k 増加しますが、速度は遅くなります
質問は:
- メモリ使用量が増えているのはなぜですか? リークはどこにあり、どのようにして一定のメモリ使用量を達成するのですか (特に starman で)。長期的にはメモリが不足したくないからです。(OK、たとえば --max-requests 100 を定義することは可能です)が、メモリ使用量の答えではありません。
- または- 私の例では何が間違っていますか?
誰かがこれもテストしたい場合は、フェッチ用のスクリプトを次に示します。
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://localhost:5000');
my $old_mem = 0;
print "req#\tmem\n";
foreach my $i (1..1000) {
my $res = $ua->request($req);
(my $mem = $res->content) =~ s/\D//g;
next if( $mem == $old_mem );
print "$i\t$mem\n";
$old_mem = $mem;
}
私の結果:
plackup plackup -r starman
req# mem req# mem req# mem
1 7780 1 3924 1 3280
2 7800 2 4296 5 3728
3 7804 3 4304 8 3280
... ...
... deleted ... deleted
... ...
839 4596 994 3912
866 4600 998 3908
962 4604 1000 3912
そう、
- なぜ
plackup
最初の 3 つのリクエストでレイズするのですか? plackup -r
- 4k の増加 (最後の行を参照) - 最初はもっと多いstarman
- 値上げもしますが、デフォルトでは 5 ワーカーで速度が遅くなります (3280->3912)
バージョン:
# cpanm Plack Starman
Plack is up to date. (0.9979)
Starman is up to date. (0.2010)
# perl -v
This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-thread-multi-2level