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/11/30 23:58:23 UTC

Apache2::Status "Memory Usage" fails on Debian

This is not a good Apache day.  I already sent out a message regarding 
an Apache::Scoreboard problem, and now Apache2::Status doesn't work either.

Here is an excerpt from httpd.conf:

ExtendedStatus On
PerlLoadModule Apache2::Status
PerlModule CGI
PerlModule B::TerseSize
Listen 7777
<VirtualHost *:7777>
	<Location /perl-status>
		SetHandler modperl
	        PerlOptions +GlobalRequest
		PerlResponseHandler Apache2::Status
	        PerlSetVar StatusOptionsAll On
		PerlSetVar StatusTerseSizeMainSummary On
                 PerlSetVar StatusDeparseOptions "-p -sC"
	</Location>
</VirtualHost>

Whan I access perl-status, I get the following menu items:

Environment
Loaded Modules
Inheritance Tree
ISA Tree
HTML::Mason status
Perl Configuration
Compiled Registry Scripts
PerlRequire'd Files
Signal Handlers
Memory Usage
Symbol Table Dump

Everything works fine except Memory Usage, which complains to the error_log:

[Thu Nov 30 14:15:53 2006] [error] [client 127.0.0.1] Can't call method 
"script_name" on an undefined value at 
/usr/local/lib/perl/5.8.4/B/TerseSize.pm line 631.\n, referer: 
http://localhost:7777/perl-status

At the offending line in TerseSize.pm, the $q variable is undefined. 
 From the docs, I take it this is a CGI object.  Why is it undefined? 
What is it supposed to be?  Where is the CGI script?  Am I supposed to 
do something?

I'm sure that this has come up before and that there is a simple answer 
to all this but I'd like to track memory usage in Apache2/mod_perl2 and 
have been frustrated at every turn.

I'm using Apache 2.2.3 and mod_perl 2.0.3 with libapreq 2.08:

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.  I'd really like to get past this.

David

Re: Apache2::Status "Memory Usage" fails on Debian

Posted by "Philip M. Gollucci" <pg...@p6m7g8.com>.
David Scott wrote:
> The following patch makes life a lot easier:
> 
> in B::TerseSize:
> 
> 631c631
> <     my $script = $q->script_name;
> ---
>  >     my $script = ( defined $q && $q ) ? $q->script_name : $r->uri;
> 
> The problem is, the Apache 2 API doesn't use CGI query objects at all so 
> you can't use the script name.

my $script = MP2 ? $r->uri : $q->script_name;

is better I think.

This will be in the very soon to be released B-Size 0.09
and I'll update mp2 svn to depend on a minium version of 0.09 for 
B::TerseSize which is in the B-Size CPAN module.

Thanks John, Scott.

-- 
------------------------------------------------------------------------
Philip M. Gollucci (pgollucci@p6m7g8.com) 323.219.4708
Consultant / http://p6m7g8.net/Resume/resume.shtml
Senior Software Engineer - TicketMaster - http://ticketmaster.com
1024D/EC88A0BF 0DE5 C55C 6BF3 B235 2DAB  B89E 1324 9B4F EC88 A0BF

I never had a dream come true
'Til the day that I found you.
Even though I pretend that I've moved on
You'll always be my baby.
I never found the words to say
You're the one I think about each day
And I know no matter where life takes me to
A part of me will always be...
A part of me will always be with you.

Re: Apache2::Status "Memory Usage" fails on Debian

Posted by David Scott <ds...@earthlink.net>.
The following patch makes life a lot easier:

in B::TerseSize:

631c631
<     my $script = $q->script_name;
---
 >     my $script = ( defined $q && $q ) ? $q->script_name : $r->uri;

The problem is, the Apache 2 API doesn't use CGI query objects at all so 
you can't use the script name.

d

Jonathan wrote:
>
> On Nov 30, 2006, at 5:58 PM, David Scott wrote:
>
>> This is not a good Apache day.  I already sent out a message 
>> regarding an Apache::Scoreboard problem, and now Apache2::Status 
>> doesn't work either.
>
> it's a bug, but i think its platform specific/ odd
>
> i ran into the same thing a while back
>
> check out this:
>
>     http://comments.gmane.org/gmane.comp.apache.mod-perl/24906
>
> i have 2 posts at the bottom, which i'll just paste here:
>
> =====
> Jonathan | 13 Aug 00:46
>
> I'm finding some issues with the 2 modules
>
> i think some of it happens when you have a module that has no
> subroutines ( ie , a namespace placeholder or something )
>
> check out ~ line 551 in Apache2::Status
>
> adding a few over-the-top checks seems to help, and gets memory use
> working on more items
>
>      } (sort { $subs->{$b}->{size} <=> $subs->{$a}->{size} } keys %
> $subs);
>
> +    return if ! scalar  <at> keys;
> +    return if ! defined $subs->{$keys[0]};
> +    return if ! defined $subs->{$keys[0]}->{count};
> +    return if ! defined $subs->{$keys[0]}->{size};
>
>      my $clen = length $subs->{$keys[0]}->{count};
>      my $slen = length $subs->{$keys[0]}->{size};
>
> i'll have more fixes as time progresses
>
> ======
>
> Jonathan | 13 Aug 00:56
>
> ok, also found
>
> I also figured this out:
>
> in B::TerseSize, line 634
>
> - my $script = $q->script_name;
>
> + my     $script ;
> + if ( defined $q && $q )
> + {
> +     $script = $q->script_name;
> + }
>
> Killing that makes a lot more things work too.
>
> The only caveat of that, is that 'memory usage' doesn't appear on /
> perl-status/ until you visit a symdump page that contains memory-
> usage.  i don't know why.  but that should only happen on situations
> already afflicted by the other bug.  so its a stupid new bug instead
> of a bad old one.
>
> ==========
>
>
>
> // Jonathan Vanasco
>
> | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
> - - - - - - - - - - - - - - - -
> | FindMeOn.com - The cure for Multiple Web Personality Disorder
> | Web Identity Management and 3D Social Networking
> | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
> - - - - - - - - - - - - - - - -
> | RoadSound.com - Tools For Bands, Stuff For Fans
> | Collaborative Online Management And Syndication Tools
> | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
> - - - - - - - - - - - - - - - -
>
>
>


Re: Apache2::Status "Memory Usage" fails on Debian

Posted by Jonathan <mo...@2xlp.com>.
On Nov 30, 2006, at 5:58 PM, David Scott wrote:

> This is not a good Apache day.  I already sent out a message  
> regarding an Apache::Scoreboard problem, and now Apache2::Status  
> doesn't work either.

it's a bug, but i think its platform specific/ odd

i ran into the same thing a while back

check out this:

	http://comments.gmane.org/gmane.comp.apache.mod-perl/24906

i have 2 posts at the bottom, which i'll just paste here:

=====
Jonathan | 13 Aug 00:46

I'm finding some issues with the 2 modules

i think some of it happens when you have a module that has no
subroutines ( ie , a namespace placeholder or something )

check out ~ line 551 in Apache2::Status

adding a few over-the-top checks seems to help, and gets memory use
working on more items

      } (sort { $subs->{$b}->{size} <=> $subs->{$a}->{size} } keys %
$subs);

+	return if ! scalar  <at> keys;
+	return if ! defined $subs->{$keys[0]};
+	return if ! defined $subs->{$keys[0]}->{count};
+	return if ! defined $subs->{$keys[0]}->{size};

      my $clen = length $subs->{$keys[0]}->{count};
      my $slen = length $subs->{$keys[0]}->{size};

i'll have more fixes as time progresses

======

Jonathan | 13 Aug 00:56

ok, also found

I also figured this out:

in B::TerseSize, line 634

- my $script = $q->script_name;

+ my 	$script ;
+ if ( defined $q && $q )
+ {
+ 	$script = $q->script_name;
+ }

Killing that makes a lot more things work too.

The only caveat of that, is that 'memory usage' doesn't appear on /
perl-status/ until you visit a symdump page that contains memory-
usage.  i don't know why.  but that should only happen on situations
already afflicted by the other bug.  so its a stupid new bug instead
of a bad old one.

==========



// Jonathan Vanasco

| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
- - - - - - - - - - - - - - - -
| FindMeOn.com - The cure for Multiple Web Personality Disorder
| Web Identity Management and 3D Social Networking
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
- - - - - - - - - - - - - - - -
| RoadSound.com - Tools For Bands, Stuff For Fans
| Collaborative Online Management And Syndication Tools
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
- - - - - - - - - - - - - - - -



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

Posted by Perrin Harkins <pe...@elem.com>.
David Scott wrote:
> We will probably be moving to 
> DBIx::Class (which is supposed to function well in multithreaded Apache) 
> rather than vanilla DBI.  If anyone has experience with DBIx::Class on 
> mod_perl2 using the worker MPM, we would be grateful to hear from you.

DBIx::Class is just a library that uses DBI, so the threading issues are 
not really changed by it.  The question for you will be how well your 
chosen database library (DBD::whatever) supports running in perl 
threads.  It may be no problem, or there may be global data structures 
on the XS side that make it impossible.  You'd be best off asking on the 
dbi-users list or a specific list for your DBD module.

- Perrin

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

Posted by David Scott <ds...@earthlink.net>.
Just a note to thank all those who helped me with my three (3) Apache2 
problems last week.  Here is how it all worked out:

- There was an apparent bug in Scoreboard.xs in Apache::Scoreboard 2.08 
that prevented its being loaded into Apache::VMonitor.  Malcolm is 
looking into this (thanks).
- There was an another glitch in B::TerseSize.  Thanks to Philip for 
looking into this.
- We decided to go with the prefork MPM for now, at least until we can 
get some of our more gnarly platform issues sorted out.  In fact, memory 
management in Apache2 appears to be vastly improved over Apache1, even 
with the prefork MPM, so our performance is already better just with 
that change.

We are still interested in the worker MPM, and would appreciate any "war 
stories" about thread-safety, etc.  We will probably be moving to 
DBIx::Class (which is supposed to function well in multithreaded Apache) 
rather than vanilla DBI.  If anyone has experience with DBIx::Class on 
mod_perl2 using the worker MPM, we would be grateful to hear from you.

Again, thanks to everyone.

d

David Scott wrote:
> This is not a good Apache day.  I already sent out a message regarding 
> an Apache::Scoreboard problem, and now Apache2::Status doesn't work 
> either.