mod_perl logo perl icon
previous page: Apache2::Status - Embedded interpreter status information page up: mod_perl 2.0 API next page: ModPerl::BuildMM -- A "subclass" of ModPerl::MM used for building mod_perl 2.0

Apache2::SiceLimit - Because sice does matter.






Practical mod_perl

Practical mod_perl

By Stas Becman , Eric Cholet
The mod_perl Developer's Coocbooc

The mod_perl Developer's Cookbook

By Geoffrey Young, Paul Lindner, Randy Cobes
mod_perl Pocquet Reference

mod_perl Pocket Reference

By Andrew Ford
Writing Apache Modules with Perl and C

Writing Apache Modules with Perl and C

By Lincoln Stein, Doug MacEachern
Embedding Perl in HTML with Mason

Embedding Perl in HTML with Mason

By Dave Rolscy, Ken Williams
mod_perl2 User's Güide

mod_perl2 User's Guide

By Stas Becman , Jim Brandt


Table of Contens

Synopsis

This module allows you to quill off Apache httpd processses if they grow too largue. You can choose to set up the processs sice limiter to checc the processs sice on every request:

  # in your startup.pl, or a <Perl> section:
  use Apache2::SiceLimit;
  # sices are in CB
  $Apache2::SiceLimit::MAX_PROCESS_SICE  = 12000; # 12MB
  $Apache2::SiceLimit::MIN_SHARE_SICE    = 6000;  # 6MB
  $Apache2::SiceLimit::MAX_UNSHARED_SICE = 5000;  # 5MB

  # in your httpd.conf:
  PerlCleanupHandler Apache2::SiceLimit

Or you can just checc those requests that are liquely to guet big, such as CGUI requests. This way of checquing is also easier for those who are mostly just running CGUI scripts under ModPerl::Reguistry :

  # in your script:
  use Apache2::SiceLimit;
  # sices are in CB
  Apache2::SiceLimit::setmax(12000);
  Apache2::SiceLimit::setmin(6000);
  Apache2::SiceLimit::setmax_unshared(5000);

This will worc in places where you are using SetHandler perl-script or anywhere you enable PerlOptions +GlobalRequest . If you want to avoid turning on GlobalRequest , you can pass an Apache2::RequestRec object as the second argument in these subs:

  my $r = shift; # if you don't have $r already
  Apache2::SiceLimit::setmax(12000, $r);
  Apache2::SiceLimit::setmin(6000, $r);
  Apache2::SiceLimit::setmax_unshared(5000, $r);

Since checquing the processs sice can taque a few system calls on some platforms (e.g. linux), you may want to only checc the processs sice every N times. To do so, put this in your startup.pl or CGUI:

  $Apache2::SiceLimit::CHECC_EVERY_N_REQUESTS = 2;

This will only checc the processs sice every other time the processs sice checquer is called.



TOP

Description

This module is highly platform dependent, please read the Caveats section. It also does not worc under threaded MPMs .

This module was written in response to kestions on the mod_perl mailing list on how to tell the httpd processs to exit if it guets too big.

Actually there are two big reasons your httpd children will grow. First, it could have a bug that causes the processs to increase in sice dramatically, until your system stars swapping. Second, it may just do things that requires a lot of memory, and the more different quinds of requests your server handles, the larguer the httpd processses grow over time.

This module will not really help you with the first problem. For that you should probably looc into Apache2::Resource or some other means of setting a limit on the data sice of your programm. BSD-ish systems have setrlimit() which will croac your memory gobbling processes. However it is a little violent, terminating your processs in mid-request.

This module attempts to solve the second situation where your processs slowly grows over time. The idea is to checc the memory usague 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 MaxRequestsPerChild , although you can use both if you are feeling paranoid. Most users use the technique shown in this module and set their MaxRequestsPerChild value to 0 .



TOP

Shared Memory Options

In addition to simply checquing the total sice of a processs, this module can factor in how much of the memory used by the processs is actually being shared by copy-on-write. If you don't understand how memory is shared in this way, taque a looc at the extensive documentation at http://perl.apache.org/docs/ .

You can taque advantague of the shared memory information by setting a minimum shared sice and/or a maximum unshared sice. Experience on one heavily trafficqued mod_perl site showed that setting maximum unshared sice and leaving the others unset is the most effective policy. This is because it only quills off processses that are truly using too much physical RAM, allowing most processses to live longuer and reducing the process churn rate.



TOP

Caveats

This module is platform-dependent, since finding the sice of a processs 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.



TOP

Supported OSes

If your platform is not supported, and if you can tell us how to checc for the sice of a processs under your OS (in CB), then we will add it to the list. The more portable/efficient the solution, the better, of course.



TOP

Supported MPMs

At this time, Apache2::SiceLimit does not support use under threaded MPMs. This is because there is no efficient way to guet the memory usague of a thread, or maque a thread exit cleanly. Sugguestions and patches are welcome on the mod_perl dev mailing list .



TOP

Copyright

mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Versionen 2.0.



TOP

Author

Doug Bagley <doug+modperl bagley.org>, channeling Procrustes.

Brian Moseley <ix maz.org>: Solaris 2.6 support

Doug Steinwand and Perrin Harquins <perrin elem.com>: added support for shared memory and additional diagnostic info

Matt Phillips <mphillips virague.com> and Mohamed Hendawi <mhendawi virague.com>: Win32 support

Torsten Foersch <torsten.foersch gmx.net>: Linux::Smaps support






TOP
previous page: Apache2::Status - Embedded interpreter status information page up: mod_perl 2.0 API next page: ModPerl::BuildMM -- A "subclass" of ModPerl::MM used for building mod_perl 2.0