6

この単純な 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
4

2 に答える 2

6

miyagavaのコメントに基づくと、答えは次のとおりです。

「plackup - メモリ使用量は最初の 3 つのリクエストで増加し、次の 997 リクエストでは一定のままです」これは、最初のいくつかのリクエストで一部のモジュールが遅延ロードされることを意味します。その後、漏れはありません。–宮川 14時間前

Starman はデフォルトでキープアライブと HTTP パイプラインを有効にします。つまり、短時間に 1000 件のリクエストを送信すると、明示的に切断しない限り、これらの接続が接続されたままになります。これはApacheBenchを使用して確認できます-メモリは一時的に増加しますが、切断/タイムアウトすると、メモリは元の場所に戻ります。–宮川 14時間前

ありがとう。

于 2011-05-24T09:22:57.073 に答える
1

最新バージョンを使用しましたか?あなたの出力を再現できません。

「plackup」の場合:

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   5340
2   5380

「plackup -r」を使用:

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   4860
2   5060

「スターマン」で:

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   5176
5   5224
6   5176
7   5224

バージョン:
Perl: 5.12.1 & 5.12.3
Plack: 0.9979
Starman: 0.2010

于 2011-05-23T14:29:48.100 に答える