dannさんが以前Catalystでやってたのを参考に、Plack/PSGIアプリケーションのメモリリークを Devel::Leak::Object で調べる方法

plackup を -MDevel::Leak::Object 付けて起動

$ plackup -MDevel::Leak::Object=GLOBAL_bless -e '$Devel::Leak::Object::TRACKSOURCELINES = 1' -s Starlet --max-workers=1 app.psgi

-e ‘$Devel::Leak::Object::TRACKSOURCELINES = 1’ を付けると行数まで出力してくれる

app.psgiはこんなの

sub {
   my $env = shift;
   my $ref;$ref = bless \$ref, 'XXX';
   [200,['Content-Type'=>'text/html'],["OK"]];
};

Starletの —max-reqs-per-child のデフォルトは 100 なので、ab使って100回アクセス。

$ ab -n 100 http://localhost:5000/

すると、plackupを起動したコンソールの最後に、

...
127.0.0.1 - - [18/Apr/2013:17:21:17 +0900] "GET / HTTP/1.0" 200 2 "-" "ApacheBench/2.3"
127.0.0.1 - - [18/Apr/2013:17:21:17 +0900] "GET / HTTP/1.0" 200 2 "-" "ApacheBench/2.3"
127.0.0.1 - - [18/Apr/2013:17:21:17 +0900] "GET / HTTP/1.0" 200 2 "-" "ApacheBench/2.3"
Tracked objects by class:
    Config                                   1
    Errno                                    1
    POSIX::SigRt                             1
    XXX                                      100

Sources of leaks:
Config
     1 from /path/to/perl5/perlbrew/perls/perl-5.16/lib/5.16.3/darwin-2level/Config.pm line: 73
Errno
     1 from /path/to/perl5/perlbrew/perls/perl-5.16/lib/5.16.3/darwin-2level/Errno.pm line: 167
POSIX::SigRt
     1 from /path/to/perl5/perlbrew/perls/perl-5.16/lib/5.16.3/Tie/Hash.pm line: 246
XXX
   100 from /path/to/Desktop/app.psgi line: 3

とでます。これで XXX があやちいことがわかりましたね

このブログ記事について

このページは、Masahiro Naganoが2013年4月18日 17:39に書いたブログ記事です。

ひとつ前のブログ記事は「Plack::Middleware::AccessLog gets faster with Apache::LogFormat::Compiler 」です。

次のブログ記事は「Monoceros というPrefork型だけどC10Kの接続を捌くことができるPSGI/Plackサーバ書きました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja