You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs-cvs@perl.apache.org by st...@apache.org on 2004/11/25 00:02:27 UTC
svn commit: r106486 - /perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod
Author: stas
Date: Wed Nov 24 15:02:27 2004
New Revision: 106486
URL: http://svn.apache.org/viewcvs?view=rev&rev=106486
Log:
extra notes on Out of memory problem
Submitted by: Brian Hirt <bh...@mobygames.com>
Modified:
perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod
Modified: perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod
Url: http://svn.apache.org/viewcvs/perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod?view=diff&rev=106486&p1=perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod&r1=106485&p2=perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod&r2=106486
==============================================================================
--- perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod (original)
+++ perl/modperl/docs/trunk/src/docs/1.0/guide/troubleshooting.pod Wed Nov 24 15:02:27 2004
@@ -667,38 +667,88 @@
See also L<Out of memory|/Out_of_memory_>
+
+
+
+
=head2 Out of memory!
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:
-
- =item -DPERL_EMERGENCY_SBRK
-
- 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
-=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.
+"Out of memory!" message and/or "Callback called exit". Common causes
+of this are never-ending loops, deep recursion, or calling an
+undefined subroutine.
+
+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 C<$^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
+C<$^M>. Run:
+
+ % perl -V:usemymalloc
+
+if your mod_perl was compiled against perl which uses internal
+C<malloc()> the answer will be 'y'.
+
+Here is an explanation of C<$^M> from the C<perlvar> manpage:
+
+ 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 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
-C<Carp::confess>, like so:
+Another trick is to have a startup script initialize C<Carp::confess>,
+like so:
use Carp ();
eval { Carp::confess("init") };
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 C<$^M> has come up on PerlMonks, and there is
+speculation that C<$^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
---------------------------------------------------------------------
To unsubscribe, e-mail: docs-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: docs-cvs-help@perl.apache.org