You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by David Scott <ds...@earthlink.net> on 2006/12/01 00:20:38 UTC

Instability at startup for Apache2/mod_perl2 using worker MPM

OK this is my third message today, hopefully it will be the last.

I've built Apache 2.2.3 and mod_perl 2.0.3 with libapreq 2.08 and the 
worker MPM.  There appears to be some kind of race condition at startup 
that prevents the server from coming up.  This only happens once in a 
while, and can be fixed by some minor configuration or code change (ie, 
adding a 'print STDERR "foobar\n"' to one of my Perl modules can cause 
the problem to occur; moving the print statement by one line can fix it).

There are two manifestations of this problem: either

(1) The first httpd process goes to 99% CPU usage and stays there 
indefinitely, never doing a restart; or
(2) The restart occurs and the new parent process forks *one* child and 
then goes to 99% CPU usage indefinitely, never completing the startup 
sequence.

I've been porting a fairly complex pure-Perl legacy application from 
mod_perl 1 to mod_perl 2.  The reason we're trying this is because 
memory requirements in MP1 are horrendous and child process death is 
extremely expensive.  The application appears to work fine once the 
Apache2 server starts.

In addition, it's not unusual for the mod_perl 1 server to take a long 
time to start up or shut down.

I suspect that there is some nasty interaction between my Perl modules 
(of which there are many).  Does anyone have suggestions on how I can 
track down the problem?  Apache2::Status is useless until the server 
starts, obviously.

Here is my system information:

Apache/2.2.3 (Unix) mod_apreq2-20051231/2.6.0 mod_perl/2.0.3 Perl/v5.8.4
configured -- resuming normal operations
[Thu Nov 30 14:15:39 2006] [info] Server built: Nov 29 2006 17:32:31

Also, here is perl -V:

Summary of my perl5 (revision 5 version 8 subversion 4) configuration:
   Platform:
     osname=linux, osvers=2.6.15.4, archname=i386-linux-thread-multi
     uname='linux ninsei 2.6.15.4 #1 smp preempt mon feb 20 09:48:53 pst
2006 i686 gnulinux '
     config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.4
-Dsitearch=/usr/local/lib/perl/5.8.4 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.4 -Dd_dosuid -des'
     hint=recommended, useposix=true, d_sigaction=define
     usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
     useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
     use64bitint=undef use64bitall=undef uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
     optimize='-O2',
     cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -I/usr/local/include'
     ccversion='', gccversion='3.3.5 (Debian 1:3.3.5-13)', gccosandvers=''
     intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
     ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
     alignbytes=4, prototype=define
   Linker and Libraries:
     ld='cc', ldflags =' -L/usr/local/lib'
     libpth=/usr/local/lib /lib /usr/lib
     libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
     perllibs=-ldl -lm -lpthread -lc -lcrypt
     libc=/lib/libc-2.3.2.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.4
     gnulibc_version='2.3.2'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
     cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
   Compile-time options: MULTIPLICITY USE_ITHREADS USE_LARGE_FILES
PERL_IMPLICIT_CONTEXT
   Built under linux
   Compiled at Mar 23 2006 21:49:08
   @INC:
     /etc/perl
     /usr/local/lib/perl/5.8.4
     /usr/local/share/perl/5.8.4
     /usr/lib/perl5
     /usr/share/perl5
     /usr/lib/perl/5.8
     /usr/share/perl/5.8
     /usr/local/lib/site_perl
     .

Thanks again.

David


Re: Instability at startup for Apache2/mod_perl2 using worker MPM

Posted by Robert Landrum <rl...@aol.net>.
Perrin Harkins wrote:
> David Scott wrote:
>> I've built Apache 2.2.3 and mod_perl 2.0.3 with libapreq 2.08 and the 
>> worker MPM.  There appears to be some kind of race condition at 
>> startup that prevents the server from coming up.  This only happens 
>> once in a while, and can be fixed by some minor configuration or code 
>> change (ie, adding a 'print STDERR "foobar\n"' to one of my Perl 
>> modules can cause the problem to occur; moving the print statement by 
>> one line can fix it).
> 
> This sounds like a possible issue with your code and threaded perl.  It 
> doesn't ring a bell as a general mod_perl issue.
> 

Interesting problem.  I remember reading about an issue with threading 
(not specific to apache or mod_perl) that occured when file descriptors 
were being modified while there were contents in the buffer.

Just for giggles, try

{
local $|=1;
use MyModules;
...
}

Rob

Re: Instability at startup for Apache2/mod_perl2 using worker MPM

Posted by Perrin Harkins <pe...@elem.com>.
David Scott wrote:
> I've built Apache 2.2.3 and mod_perl 2.0.3 with libapreq 2.08 and the 
> worker MPM.  There appears to be some kind of race condition at startup 
> that prevents the server from coming up.  This only happens once in a 
> while, and can be fixed by some minor configuration or code change (ie, 
> adding a 'print STDERR "foobar\n"' to one of my Perl modules can cause 
> the problem to occur; moving the print statement by one line can fix it).

This sounds like a possible issue with your code and threaded perl.  It 
doesn't ring a bell as a general mod_perl issue.

> I've been porting a fairly complex pure-Perl legacy application from 
> mod_perl 1 to mod_perl 2.  The reason we're trying this is because 
> memory requirements in MP1 are horrendous and child process death is 
> extremely expensive.

Do you realize that it will take MORE memory when run with threads?  If 
you want to keep memory down, use the prefork MPM.  See the list 
archives for discussion about memory and Perl threads.  Also, threads 
slow down startup since a lot of work has to be done when spawning them 
to copy all the data structures for each one.

> In addition, it's not unusual for the mod_perl 1 server to take a long 
> time to start up or shut down.

Slow startup on mod_perl 1 usually means you are compiling a lot of code 
or doing some other time-consuming thing in your startup code, like 
maybe talking to a database.

> Does anyone have suggestions on how I can 
> track down the problem?

I'd start by switching to prefork and seeing if it's still there.  If it 
is, the most reliable method is to take things out until the problem 
goes away.  It's not instant gratification, but it works.

- Perrin