CatalystアプリのメモリーリークをDevel::Leak::Objectでチェック

Devel::Leak::Object
http://search.cpan.org/~adamk/Devel-Leak-Object-0.92/lib/Devel/Leak/Object.pm

これでオブジェクトのリークを調べる事ができます。

事前準備

exit(0)をcallするControllerを用意

TestApp::Web::Controller::Root

sub exit : Local {
    my ($self, $c) = @_; 
    if ($ENV{TESTAPP_EXIT_OK}) {
        exit(0);
    }   
}

メモリリークチェック

テストサーバー起動

TESTAPP_EXIT_OK=1 perl -MDevel::Leak::Object=GLOBAL_bless script/testapp_server.pl -d

調べたいパスにリクエスト送る

ab -n 100 http://localhost:3000/multiadaptor/count

ブラウザで以下のパスを表示。

http://localhost:3000/exit

以下のようにブラウザに、クラス毎にオブジェクト数が表示されます。これでメモリリークのチェックも大分簡単になりますね。perlレベルでのリークは、これで大分簡単にチェックができますね。

Tracked objects by class:
CGI::Simple::Util                        1
Catalyst::Action                         15
Catalyst::ActionContainer                2
Catalyst::DispatchType::Default          1
Catalyst::DispatchType::Index            1
Catalyst::DispatchType::Path             1
Catalyst::DispatchType::Regex            1
Catalyst::Dispatcher                     1
Catalyst::Engine::HTTP                   1
Catalyst::Log                            1
Class::MOP::Attribute                    76
Class::MOP::Class                        12
Class::MOP::Class::__ANON__::SERIAL::1   26
Class::MOP::Class::__ANON__::SERIAL::2   17
Class::MOP::Immutable                    2
Class::MOP::Instance                     31
Class::MOP::Method                       384
Class::MOP::Method::Accessor             143
Class::MOP::Method::Wrapped              20
Class::Struct::Tie_ISA                   1
Config                                   1
Errno                                    1
Moose::Meta::Attribute                   87
Moose::Meta::Class                       19
Moose::Meta::Instance                    42
Moose::Meta::Method                      389
Moose::Meta::Method::Accessor            90
Moose::Meta::Method::Constructor         15
Moose::Meta::Role                        2
Moose::Meta::TypeConstraint              18
Moose::Meta::TypeConstraint::Class       29
Moose::Meta::TypeConstraint::Parameterizable 3
Moose::Meta::TypeConstraint::Registry    1
Moose::Meta::TypeConstraint::Role        2
Path::Class::Dir                         1
TestApp::Service::AnotherClass           1
TestApp::Service::SomeClass              1
TestApp::Web::Controller::MultiAdaptor   1
TestApp::Web::Controller::Root           1
TestApp::Web::Model::Service             1
Tree::Simple                             2

これでリクエストの度に増えているオブジェクトを見つけてから当たりをつけてコードチェック。その後、Devel::Cycleなどでチェックという感じで、割と簡単にオブジェクトのリークチェックができます。

Happy Debugging !