I don't know about ModPerl::RegistryLoader, but the simplest solution is just 
to "preload" the interpreters either manually or through a script whenever you 
restart Apache. In your httpd.conf file, you control how many interpreters are 
running and how many hits each interpreter handles before reloading that 
interpreter (it can be unlimited if you wish). If, e.g., you're configured to 
run 6 interpreters, to be sure they're all loaded, you will need to send 6 
concurrent requests to the server - if you send requests serially, it might use 
the same interpreter to serve all 6 requests. In our case, we've set up a web 
page that is a frames page with multiple frames, each making the same request 
to the server. We also have a script that utilizes LWP::UserAgent to do 
basically the same thing.

FYI, our application consists of a single script which, depending on the 
parameters passed to it, can do many different things. Because of that, once 
that one script is loaded in an interpreter, there's nothing else to load. If 
you have many separate scripts, you can either do the above, but for each 
script. However, usually if you have many scripts, each script is quite small, 
but may load many Perl libraries (i.e. modules). Keep in mind that if you load 
a single script that loads, e.g. 10 Perl libraries, then when another script is 
required that uses some of those libraries, Perl will detect the libraries that 
have already been loaded and not load them again. For that reason, the other 
scripts should load very quickly so it may be sufficient to just preload the 
script that uses the most of these common libraries.

An httpd.conf configuration we often use is something like:

# Set up the settings for interpreters within mod_perl

PerlInterpStart 12
PerlInterpMax 12
PerlInterpMinSpare 12
PerlInterpMaxSpare 12
PerlInterpMaxRequests 2048

We've found that having a fixed number of interpreters at all times works best 
for us - we've had problems in the past where an interpreter is retired by 
Apache when the load temporarily drops, only to be started up when the load 
picks back up (usually within a very short amount of time), requiring a full 
reload and slowing down response. That's why the first 4 settings are all the 
same. You might want to look it up, but I believe that if PerlInterpMaxRequests 
is set to 0, an interpreter will take an unlimited number of hits without 
reloading. Reloading an interpreter, however, can help if you have memory leaks 
or other such "bad" things that accumulate over time.
________________________________________
From: Jiří Pavlovský [j...@getnet.cz]
Sent: Thursday, July 21, 2011 4:45 AM
To: modperl@perl.apache.org
Subject: ModPerl::RegistryLoader

Hello,

The documentation for "ModPerl::Registry" states: "Note that each httpd
process or "child" must compile each script once, so the first request
to one server may seem slow, but each request there after will be
faster. If your scripts are large and/or make use of many Perl modules,
this difference should be noticeable to the human eye."

I've indeed run into this as my service is not accessed so often so
typically the user requests reaches some httpd child which did not
compile the script yet. So user usually has to wait for the compilation.
In my case the difference is huge (2s versus tenths of ms) which makes
notable difference for the user experience for the various autocomplete
inputs etc.

So I was looking a solution and found ModPerl::RegistryLoader. I'm just
not sure I understand it completely. Is this the "compile once at
startup" solution? Do I just put " my $rlbb =
ModPerl::RegistryLoader->new();" into my startup file?


Thank you,
Jiri

Reply via email to