perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fred Moyer <f...@redhotpenguin.com>
Subject Using dtrace to determine which modules aren't loaded at startup time
Date Fri, 07 Dec 2007 18:10:44 GMT
Greetings mod_perl list,

I've been having fun with dtrace, and I most recently used it to see 
what files are being accessed by mod_perl during requests.  I've 
preloaded all the modules in my application that I know about into 
startup.pl, but when I startup my httpd server and make a request, I got 
some unexpected results.

sudo rwsnoop -n httpd

   501   3509 httpd        R     405 http.pm
   501   3509 httpd        R       0 http.pm
   501   3509 httpd        R    2239 _server.pm
   501   3509 httpd        R       0 _server.pm
   501   3509 httpd        R    4096 _generic.pm
   501   3509 httpd        R    1563 _generic.pm
   501   3509 httpd        R       0 _generic.pm
   501   3509 httpd        R    2052 _query.pm
   501   3509 httpd        R       0 _query.pm

Those files showed up during the first request, but not subsequent 
requests.  A little digging showed that this was the URI::http module 
being loaded at runtime, since my application uses URI.  But I
'use URI ();' in my startup.pl - apparently URI::http isn't being 
loaded.  Looks like URI requires http.pm at runtime:

URI.pm:

     # check we actually have one for the scheme:
     unless (@{"${ic}::ISA"}) {
         # Try to load it
         eval "require $ic";

Fine and good, I added URI::http to my startup.pl and those file stats 
went away.  There were some other offenders too though:

   501   3508 httpd        R    4096 utf8_heavy.pl
   501   3508 httpd        R    4096 utf8_heavy.pl
   501   3508 httpd        R    2323 utf8_heavy.pl
   501   3508 httpd        R       0 utf8_heavy.pl
   501   3508 httpd        R    4096 PVA.pl
   501   3508 httpd        R    4096 PVA.pl
   501   3508 httpd        R    4096 PVA.pl
   501   3508 httpd        R    4096 PVA.pl
   501   3508 httpd        R    1952 PVA.pl
   501   3508 httpd        R       0 PVA.pl
   501   3508 httpd        R    1279 Exact.pl
   501   3508 httpd        R       0 Exact.pl
   501   3508 httpd        R    4096 Canonical.pl
   501   3508 httpd        R    4096 Canonical.pl
   501   3508 httpd        R    4096 Canonical.pl
   501   3508 httpd        R    4096 Canonical.pl
   501   3508 httpd        R    4096 Canonical.pl
   501   3508 httpd        R    1529 Canonical.pl
   501   3508 httpd        R       0 Canonical.pl
   501   3508 httpd        R    4096 Fold.pl
   501   3508 httpd        R    4096 Fold.pl
   501   3508 httpd        R    4096 Fold.pl
   501   3508 httpd        R    1709 Fold.pl
   501   3508 httpd        R       0 Fold.pl
   501   3508 httpd        R     324 SpacePer.pl
   501   3508 httpd        R       0 SpacePer.pl

Hmm, I use Encode in my application, and preload it but why aren't those 
files being loaded at startup?

I tried adding 'use utf8 ();' to startup.pl and it had no effect.

So I added the following require directives to startup.pl

    require 'utf8_heavy.pl';
    require 'unicore/PVA.pl';
    require 'unicore/Exact.pl';
    require 'unicore/Canonical.pl';
    require 'unicore/To/Fold.pl';
    require 'unicore/lib/gc_sc/SpacePer.pl';

and everything but Fold.pl and SpacePer.pl was loaded at startup.  The 
remainind dtrace lines:

   501   3687 httpd        R    4096 Fold.pl
   501   3687 httpd        R    4096 Fold.pl
   501   3687 httpd        R    4096 Fold.pl
   501   3687 httpd        R    1709 Fold.pl
   501   3687 httpd        R       0 Fold.pl
   501   3687 httpd        R     324 SpacePer.pl
   501   3687 httpd        R       0 SpacePer.pl

I'm not sure why these programs are still loaded at runtime, but I've 
probably managed to save about 40k or so per process by preloading these 
modules I am guessing.  Not much but every byte counts.

If anyone has the unicode foo to tell me why those programs aren't 
loading, I'd be very interested in knowing.

- Fred

Mime
View raw message