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

Reply via email to