[Catalyst] Tracking down memory leaks

Stuart Watt swatt at infobal.com
Wed Dec 24 16:47:45 GMT 2008


Bill Moseley wrote:
> What are some good methods for tracking down memory leaks?  I used
> Devel::Cycle on $c in handle_request() to find one leak.  But, I
> suspect I've got a circular reference elsewhere still by the size of
> my processes after a while.  (Processes start out showing 70MB and end
> up at 140MB rss -- which includes shared memory, of course).
>   
Devel::Leak saved me several times over, but I did need to build a 
debugging Perl to see the contents. When I did that, most of the leaks I 
was responsible for were easy to find and fix. I just used 
NoteSV/CheckSV in the loop, to pick up anything left from a previous 
iteration. In the end I still found DBI and some DBDs were responsible 
for most of my missing memory, and upgrading them took away of lot of 
issues.

All the best
Stuart
-- 
Stuart Watt
ARM Product Developer
Information Balance
> I'm also curious about seeing an increase in "rss" memory in a
> very simple Catalyst application.  Could be my testing, or 5.10.0 on
> this machine.
>
> $ perl rssmem.pl
> Start Rss : 7444
> After one request Rss : 9592
> Request 1000:  Rss: 9636
> Request 2000:  Rss: 9696
> Request 3000:  Rss: 9756
> Request 4000:  Rss: 9816
> Request 5000:  Rss: 9880
>
> It's not that significant, and I think I restart my processes after 1000
> requests.
>
> $ cat rssmem.pl
> use strict;
> use warnings;
> use HTTP::Request::AsCGI;
> use Catalyst::Utils;
> use Linux::Smaps;
> my $smap = Linux::Smaps->new( $$ );
> App->setup;
>
> print 'Start Rss : ', $smap->rss, "\n";
> my $r = make_request();
>
> my $before = $smap->all;
> $smap->update;
> print 'After one request Rss : ', $smap->rss, "\n";
>
> for ( 1 .. 5000 ) {
>     make_request();
>     next if $_ % 1000;
>
>     $smap->update;
>     print "Request $_:  Rss: " . $smap->rss,"\n";
> }
>
>
> sub make_request {
>     my $request = Catalyst::Utils::request( '/ping' );
>     my $cgi     = HTTP::Request::AsCGI->new( $request, %ENV )->setup;
>
>     # Uncomment and no gain in rss.
>     #return;
>
>     App->handle_request;
>
>     return $cgi->restore->response;
> }
>
>
> package App;
> use strict;
> use warnings;
> use Catalyst;
>
> sub ping : Local {
>     my ( $self, $c ) = @_;
>     $c->res->body( 'ping' );
> }
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>   






More information about the Catalyst mailing list