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 があやちいことがわかりましたね