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 !