perl-docs-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
Subject svn commit: r109986 - /perl/modperl/docs/trunk/src/docs/2.0/api/Apache/SizeLimit.pod /perl/modperl/docs/trunk/src/docs/2.0/api/config.cfg
Date Mon, 06 Dec 2004 16:35:42 GMT
Author: stas
Date: Mon Dec  6 08:35:40 2004
New Revision: 109986

perrin has ported Apache::SizeLimit


Added: perl/modperl/docs/trunk/src/docs/2.0/api/Apache/SizeLimit.pod
--- (empty file)
+++ perl/modperl/docs/trunk/src/docs/2.0/api/Apache/SizeLimit.pod	Mon Dec  6 08:35:40 2004
@@ -0,0 +1,172 @@
+=head1 NAME
+Apache::SizeLimit - Because size does matter.
+=head1 Synopsis
+This module allows you to kill off Apache httpd processes if they grow
+too large.  You can choose to set up the process size limiter to check
+the process size on every request:
+  # in your, or a <Perl> section:
+  use Apache::SizeLimit;
+  # sizes are in KB
+  $Apache::SizeLimit::MAX_PROCESS_SIZE  = 12000; # 12MB
+  $Apache::SizeLimit::MIN_SHARE_SIZE    = 6000;  # 6MB
+  $Apache::SizeLimit::MAX_UNSHARED_SIZE = 5000;  # 5MB
+  # in your httpd.conf:
+  PerlCleanupHandler Apache::SizeLimit
+Or you can just check those requests that are likely to get big, such
+as CGI requests.  This way of checking is also easier for those who
+are mostly just running CGI scripts under C<ModPerl::Registry>:
+  # in your script:
+  use Apache::SizeLimit;
+  # sizes are in KB
+  Apache::SizeLimit::setmax(12000);
+  Apache::SizeLimit::setmin(6000);
+  Apache::SizeLimit::setmax_unshared(5000);
+Since checking the process size can take a few system calls on some
+platforms (e.g. linux), you may want to only check the process size
+every N times.  To do so, put this in your or CGI:
+  $Apache::SizeLimit::CHECK_EVERY_N_REQUESTS = 2;
+This will only check the process size every other time the process
+size checker is called.
+=head1 Description
+This module is highly platform dependent, please read the
+L<CAVEATS|/Caveats> section.  It also does not work under threaded
+MPMs, as explained below.
+This module was written in response to questions on the mod_perl
+mailing list on how to tell the httpd process to exit if it gets too
+Actually there are two big reasons your httpd children will grow.
+First, it could have a bug that causes the process to increase in size
+dramatically, until your system starts swapping.  Second, it may just
+do things that requires a lot of memory, and the more different kinds
+of requests your server handles, the larger the httpd processes grow
+over time.
+This module will not really help you with the first problem.  For that
+you should probably look into Apache::Resource or some other means of
+setting a limit on the data size of your program.  BSD-ish systems
+have setrlimit() which will croak your memory gobbling processes.
+However it is a little violent, terminating your process in
+This module attempts to solve the second situation where your process
+slowly grows over time.  The idea is to check the memory usage after
+every request, and if it exceeds a threshold, exit gracefully.
+By using this module, you should be able to discontinue using the
+Apache configuration directive B<MaxRequestsPerChild>, although you
+can use both if you are feeling paranoid.  Personally, I just use the
+technique shown in this module and set my MaxRequestsPerChild value to
+=head1 Shared Memory Options
+In addition to simply checking the total size of a process, this
+module can factor in how much of the memory used by the process is
+actually being shared by copy-on-write.  If you don't understand how
+memory is shared in this way, take a look at the extensive
+documentation at
+You can take advantage of the shared memory information by setting a
+minimum shared size and/or a maximum unshared size.  Experience on one
+heavily trafficked mod_perl site showed that setting maximum unshared
+size and leaving the others unset is the most effective policy.  This
+is because it only kills off processes that are truly using too much
+physical RAM, allowing most processes to live longer and reducing the
+process churn rate.
+=head1 Caveats
+This module is platform dependent, since finding the size of a process
+is pretty different from OS to OS, and some platforms may not be
+supported.  In particular, the limits on minimum shared memory and
+maximum shared memory are currently only supported on Linux and BSD.
+If you can contribute support for another OS, please do.
+Currently supported OSes:
+=over 4
+=item linux
+For linux we read the process size out of /proc/self/status.  This
+seems to be fast enough on modern systems. If you are worried about
+performance, try setting the CHECK_EVERY_N_REQUESTS option.
+=item Solaris 2.6 and above
+For solaris we simply retrieve the size of /proc/self/as, which
+contains the address-space image of the process, and convert to KB.
+Shared memory calculations are not supported.
+NOTE: This is only known to work for solaris 2.6 and above. Evidently
+the /proc filesystem has changed between 2.5.1 and 2.6. Can anyone
+confirm or deny?
+=item *BSD*
+Uses BSD::Resource::getrusage() to determine process size.  This is
+pretty efficient (a lot more efficient than reading it from the /proc
+fs anyway).
+=item AIX?
+Uses BSD::Resource::getrusage() to determine process size.  Not sure
+if the shared memory calculations will work or not.  AIX users?
+=item Win32
+Uses Win32::API to access process memory information.  Win32::API can
+be installed under ActiveState perl using the supplied ppm utility.
+If your platform is not supported, and if you can tell me how to check
+for the size of a process under your OS (in KB), then I will add it to
+the list.  The more portable/efficient the solution, the better, of
+=head1 Threaded MPMs
+At this time, Apache::SizeLimit does not support use under threaded
+MPMs, including "worker."  This is because there is no efficient way
+to get the memory usage of a thread, or make a thread exit cleanly.
+Suggestions and patches are welcome on the mod_perl dev mailing list.
+=head1 Copyright
+mod_perl 2.0 and its core modules are copyrighted under
+The Apache Software License, Version 2.0.
+=head1 Author
+Doug Bagley <doug+modperl>, channeling Procrustes.
+Brian Moseley <ix>: Solaris 2.6 support
+Doug Steinwand and Perrin Harkins <perrin>: added support for
+shared memory and additional diagnostic info
+Matt Phillips <mphillips> and Mohamed Hendawi
+<mhendawi>: Win32 support

Modified: perl/modperl/docs/trunk/src/docs/2.0/api/config.cfg
--- perl/modperl/docs/trunk/src/docs/2.0/api/config.cfg	(original)
+++ perl/modperl/docs/trunk/src/docs/2.0/api/config.cfg	Mon Dec  6 08:35:40 2004
@@ -34,7 +34,6 @@
-        Apache/Resource.pod
@@ -87,7 +86,9 @@
+        Apache/Resource.pod
+        Apache/SizeLimit.pod
     group    => 'Internal Modules',

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message