[Catalyst] Tracking down memory leaks

Bill Moseley moseley at hank.org
Wed Dec 24 16:23:15 GMT 2008


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).

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' );
}














-- 
Bill Moseley
moseley at hank.org
Sent from my iMutt




More information about the Catalyst mailing list