On Wed, Feb 25, 2009 at 9:47 AM, Joel Bernstein <j...@fysh.org> wrote:

> 2009/2/25 Bill Moseley <mose...@hank.org>:
> > On Wed, Feb 25, 2009 at 08:01:55AM -0800, J. Shirley wrote:
> >> As other people mentioned, you likely have a memory leak or some other
> >> problem.  I have a much larger application than yours, and my memory
> usage
> >> doesn't grow.
> >>
> >> Please don't spread FUD saying that Catalyst "literally explodes".  It
> does
> >> if you poorly write your application and don't check for memory leaks.
> >
> > Oh good.  This reminded me I was looking for a leak a few months back.
> > It wasn't significant enough to worry about at the time (thanks to our
> > memory-fat servers).
> >
> > I was playing with Linux::Smaps and trying to understand why memory
> > was going up.  Again, I never had time to look at it in detail, and it's
> > probably something obvious or simply just an invalid test.  But, my
> > script is really simple.
> >
> > What was curious was a considerable large change in memory after the
> > first request, but memory still increases every request.
>
> The large change in memory after first request seems inevitable.
> Presumably your Catalyst processes are forked from a common parent?
> They will share the parent process's memory with copy-on-write
> semantics. As soon as your app serves requests, it modifies data in
> memory. Any pages containing storage for those shared variables will
> be copied (i.e. allocated within the current process) and written.
> Thus the first hit is likely to show the process growing.
>
> On the other hand, the memory leak you describe seems odd.
>
> >
> > $ perl /home/moseley/catalyst_leak.pl
> > ping
> > Initial rss is  7488kb
> > Current rss is  9648kb after 500 requests
> > Current rss is  9676kb after 1000 requests
> > Current rss is  9708kb after 1500 requests
> > Current rss is  9736kb after 2000 requests
> > Current rss is  9768kb after 2500 requests
> > Current rss is  9796kb after 3000 requests
> > Current rss is  9828kb after 3500 requests
> > Current rss is  9852kb after 4000 requests
> > Current rss is  9880kb after 4500 requests
> > Current rss is  9912kb after 5000 requests
> > Current rss is  9940kb after 5500 requests
> > Current rss is  9976kb after 6000 requests
> > Current rss is 10004kb after 6500 requests
> > Current rss is 10036kb after 7000 requests
> > Current rss is 10064kb after 7500 requests
> > Current rss is 10096kb after 8000 requests
> > Current rss is 10124kb after 8500 requests
> > Current rss is 10156kb after 9000 requests
> > Current rss is 10184kb after 9500 requests
> > Current rss is 10212kb after 10000 requests
>
> So you're leaking about 57 bytes per request. I assume you're on a
> 32-bit machine? Sounds like a single large scalar leak. Time to pull
> out the usual suspects (Devel::Leak, Devel::LeakTrace, Devel::Cycle,
> Devel::Gladiator, etc) and start searching your app.
>
> >
> > $ cat catalyst_leak.pl
> > use strict;
> > use warnings;
> > use HTTP::Request::AsCGI;
> > use Catalyst::Utils;
> > use Linux::Smaps;
> > my $smap = Linux::Smaps->new( $$ );
> > App->setup;
> >
> > my $r = make_request();  # prime the pump
> > print $r->content, "\n";
> >
> > printf "Initial rss is %5dkb\n", $smap->rss;
> >
> > for my $count ( 1 .. 10_000 ) {
> >    make_request();
> >    next if $count % 500;
> >
> >    $smap->update;
> >    printf( "Current rss is %5dkb after %d requests\n", $smap->rss, $count
> );
> > }
> >
> >
> > sub make_request {
> >    my $request = Catalyst::Utils::request( '/ping' );
> >    my $cgi     = HTTP::Request::AsCGI->new( $request, %ENV )->setup;
> >    App->handle_request;
> >    return $cgi->restore->response;
> > }
>
> This seems odd to me. Where did you find this pattern? I've never seen
> anybody test a Catalyst webapp in this way before.
> Are you confident that the CGI-request lib doesn't leak, for example?
> Can you reproduce this memory leakage using a realistic test, against
> the running web app, over HTTP?
>
> > package App;
> > use strict;
> > use warnings;
> > use Catalyst;
> >
> > sub ping : Local {
> >    my ( $self, $c ) = @_;
> >    $c->res->body( 'ping' );
> > }
>
> Admittedly this looks like an awfully simple app, there doesn't seem
> an obvious leak here. Hence we wondering if your rather odd-looking
> test is to blame.
>
> What versions of Catalyst, any plugins, etc? Can you provide more data
> to support this?
>
> /joel
>
>
>
All of my application leak tests were inspired by jrock's profiling entry,
with a cycle check and an external script monitoring memory usage.  I
wrapped some suspected model classes in a cycle test, inside of sub
ACCEPT_CONTEXT { }.  I unfortunately don't remember the details and don't
have

I found that certain test scripts would leak memory, but running under the
Catalyst standalone server without reload or anything would not cause any
increase it size.  This way I was getting a more "cleanroom" test that more
reflected reality.

-J
_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to