Sounds like André is on the right track. I've certainly run into a similar
issue (with a non-Koha app).

However, because I was using the Catalyst framework, I was able to just
preload the entire app, so that the Perl modules were loaded into the Apache
master process before forking, and that did the trick. That app is a lot
smaller than Koha though too. This case is a bit more complicated since Koha
isn't really a MVC app, but you could look at the Koha Plack examples and
see which modules they pre-load. 

You might also want to run ilsdi.pl with Devel::NYTProf to identify what
exactly is slowing down that 1s long query.

I've only played with PerlOptions +Parent a bit, but I'm guessing that you
have multiple mod_perl apps, and that we're not actually seeing your entire
httpd.conf configuration relating to Koha, right? 

David Cook
Systems Librarian
Prosentient Systems
72/330 Wattle St
Ultimo, NSW 2007
Australia

Office: 02 9212 0899
Direct: 02 8005 0595


> -----Original Message-----
> From: André Warnier [mailto:a...@ice-sa.com]
> Sent: Tuesday, 4 October 2016 10:02 PM
> To: modperl@perl.apache.org
> Subject: Re: Cache refresh each 50 queries?
> 
> Hi.
> 
> On 04.10.2016 10:17, SUZUKI Arthur wrote:
> [...]
> 
> >
> > On 03.10.2016 16:57, SUZUKI Arthur wrote:
> >>> Hello List,
> >>> I'm sending this message to know if there are some hints/tips to
> >>> help with the problem we're facing.
> >>> The problem is that for a same query repeated over time, reply time
> >>> can be as short as 5ms and as long as 1s.
> >>>
> >>> Since there is neither correlation with CPU load or RAM usage, nor
> >>> any networking constraints, we think it is due to the cache refresh
> >>> mechanism.
> >>>
> >>> The problem occurs at random times, with a probability of around
> >>> 1/50 queries (empirical data).
> >>>
> >>> Is there any configuration option which could help?
> >>>
> >>> Our current httpd.conf contains the following:
> >>>
> >>> PerlModule ModPerl::Registry
> >>> PerlOptions +Parent
> >>> PerlSwitches -I/home/koha/src
> >>>
> >>> <Files "ilsdi.pl">
> >>>    SetHandler perl-script
> >>>    # more faster, link with worker
> >>>    PerlResponseHandler ModPerl::Registry
> >>>    # less faster, link with prefork
> >>>    #PerlResponseHandler ModPerl::PerlRun
> >>>    Options +ExecCGI
> >>>    PerlOptions +ParseHeaders
> >>> </Files>
> >>>
> >>> Thanks a lot in advance for your replies.
> >>> Best regards,
> >
> 
> You still do not provide enough information about your server
configuration
> (the part not mod_perl specific) to really make a narrow guess, but let me
try
> anyway :
> 
> One thing that might explain a seemingly-long processing time for a
request
> approximately once in 50 calls, is if there was something special and
> resource-intensive which happens once per approximately 50 calls, right ?
> 
> One thing which /might/ explain this, /perhaps/ and depending on your
> configuration, is if approximately once in 50 calls, Apache had to fork a
new
> child process, to handle the call. This new child process would then start
with
> a brand-new, fresh Perl interpreter, which might need to recompile some
> modules before it even starts handling the request.
> 
> Look for example here :
> http://perl.apache.org/docs/2.0/user/config/config.html#C_Parent_
> and your configuration line above :
>   PerlOptions +Parent
> 
> In that configuration, the cgi-bin script which you are running (and all
its
> dependencies), is not compiled by the embedded perl until it has been run
at
> least once.
> So the first execution will take more time than the following ones.
> Now if the rest of your configuration is so that every 50 requests or so,
> Apache starts a new child with a new perl interpreter, that may explain
the
> symptoms that you are observing.
> 
> When Apache handles a request (if it is a "prefork" MPM), it will look for
a
> child Apache which is free, to pass the request for execution.  If the
server is
> lightly loaded, it may be that the child to which it passes the next
request is
> always the same, because it is always done with the previous request, and
> free, when the next request comes in.
> But if this child process somehow has a limit to how many requests it may
> process before it dies, and this limit was around 50, then somewhere
around
> the 50th request, another child would get the next request, and for this
child
> it would be the first one (or the first one with /this/ cgi-bin script).
> 
> There are roughly similar phenomenons that might happen in other kinds of
> Apache MPM's, which is why it is important to know which one you are
using,
> and with which setup parameters.
> 
> And yes, there are ways to improve this.  But again, we would need to know
> more about your configuration in order to make suggestions.



Reply via email to