You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Stas Bekman <st...@stason.org> on 2004/11/25 00:02:34 UTC

Re: Callback called exit.

Brian Hirt wrote:
> I've typed up my suggestions to the troubleshooting doc, and 
> incorporated glen's suggestions too.   Stas wants me to post to the list 
> to see if there are any comments / corrections.
> 
> I wasn't sure if I should put a comment in about __DIE__ handlers and 
> their use with evals, it seemed like that might be too general perl.

Thanks Brian, very late but now committed.

> Index: src/docs/1.0/guide/troubleshooting.pod
> ===================================================================
> RCS file: 
> /home/cvspublic/modperl-docs/src/docs/1.0/guide/troubleshooting.pod,v
> retrieving revision 1.28
> diff -u -r1.28 troubleshooting.pod
> --- src/docs/1.0/guide/troubleshooting.pod      5 May 2004 03:29:38 
> -0000       1.28
> +++ src/docs/1.0/guide/troubleshooting.pod      6 May 2004 22:40:07 -0000
> @@ -589,27 +589,45 @@
> 
>  If something goes really wrong with your code, Perl may die with an
>  "Out of memory!" message and/or "Callback called exit".  Common causes 
> of this
> -are never-ending loops, deep recursion, or calling an
> -undefined subroutine.  Here's one way to catch the problem: See Perl's
> -INSTALL document for this item:
> +are never-ending loops, deep recursion, or calling an undefined 
> subroutine.
> 
> -  =item -DPERL_EMERGENCY_SBRK
> +If you are using  perl 5.005 or later, and perl is compiled to use it's 
> own
> +malloc rutines, you can trap out of memory errors by setting aside an 
> extra
> +memory pool in the special variable $^M.  By default perl uses the 
> operating
> +system malloc for many popular systems, so unless you build perl with
> +'usemymalloc=y' you probably wont be able to use $^M.  To check if your 
> mod_perl
> +was compiled to use perl's internal malloc(), stick the following code 
> in a
> +handler and see if usemymalloc is set to 'y'
> +
> +       use Config;
> +
> +       print Config::myconfig();
> +
> +Here is an explanation of $^M from perlvar(i):
> +
> +   $^M     By default, running out of memory is an untrap-
> +          pable, fatal error.  However, if suitably built,
> +          Perl can use the contents of $^M as an emergency
> +          memory pool after die()ing.  Suppose that your
> +          Perl were compiled with -DPERL_EMERGENCY_SBRK and
> +          used Perl's malloc.  Then
> +
> +              $^M = 'a' x (1 << 16);
> +
> +          would allocate a 64K buffer for use in an emer-
> +          gency.  See the INSTALL file in the Perl distribu-
> +          tion for information on how to enable this option.
> +          To discourage casual use of this advanced feature,
> +          there is no English long name for this variable.
> 
> -  If PERL_EMERGENCY_SBRK is defined, running out of memory need not be a
> -  fatal error: a memory pool can allocated by assigning to the special
> -  variable $^M.  See perlvar(1) for more details.
> -
> -If you compile with that option and add 'C<use Apache::Debug level
> +If your perl installation supports $^M and you add 'C<use Apache::Debug 
> level
>  =E<gt> 4;>' to your Perl script, it will allocate the C<$^M> emergency
>  pool and the C<$SIG{__DIE__}> handler will call C<Carp::confess>,
>  giving you a stack trace which should reveal where the problem is.
>  See the C<Apache::Resource> module for ways to control httpd
>  processes.
> 
> -Note that Perl 5.005 and later have C<PERL_EMERGENCY_SBRK> turned on
> -by default.
> -
> -The other trick is to have a startup script initialize
> +Another trick is to have a startup script initialize
>  C<Carp::confess>, like so:
> 
>    use Carp ();
> @@ -617,6 +635,24 @@
> 
>  this way, when the real problem happens, C<Carp::confess> doesn't eat
>  memory in the emergency pool (C<$^M>).
> +
> +Some other mod_perl users have reported that this works well for them:
> +
> +    ## Allocate 64K as an emergency memory pool for use in out of 
> memory situation
> +    $^M = 0x00 x 65536;
> +
> +    ## Little trick to initialize this routine here so that in the case 
> of OOM,
> +    ## compiling this routine doesn't eat memory from the emergency 
> memory pool $^M
> +    use CGI::Carp ();
> +    eval { CGI::Carp::confess('init') };
> +
> +    ## Importing CGI::Carp sets $main::SIG{__DIE__} = \&CGI::Carp::die;
> +    ## Override that to additionally give a stack backtrace
> +    $main::SIG{__DIE__} = \&CGI::Carp::confess;
> +
> +Discussion of $^M has come up on PerlMonks, and there is speculation 
> that $^M is a
> +forgotten feature that's not well supported.  See
> +http://perlmonks.org/index.pl?node_id=287850 for more information.
> 
>  =head2 server reached MaxClients setting, consider raising the 
> MaxClients setting


-- 
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html