mirror of
https://github.com/apache/httpd.git
synced 2025-05-19 02:21:09 +03:00
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86620 13f79535-47bb-0310-9956-ffa450edef68
183 lines
8.1 KiB
HTML
183 lines
8.1 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE>Descriptors and Apache</TITLE>
|
|
</HEAD>
|
|
|
|
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
|
|
<BODY
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#000080"
|
|
ALINK="#FF0000"
|
|
>
|
|
<!--#include virtual="header.html" -->
|
|
<H1 ALIGN="CENTER">Descriptors and Apache</H1>
|
|
|
|
<P>A <EM>descriptor</EM>, also commonly called a <EM>file handle</EM> is
|
|
an object that a program uses to read or write an open file, or open
|
|
network socket, or a variety of other devices. It is represented
|
|
by an integer, and you may be familiar with <CODE>stdin</CODE>,
|
|
<CODE>stdout</CODE>, and <CODE>stderr</CODE> which are descriptors 0,
|
|
1, and 2 respectively.
|
|
Apache needs a descriptor for each log file, plus one for each
|
|
network socket that it listens on, plus a handful of others. Libraries
|
|
that Apache uses may also require descriptors. Normal programs don't
|
|
open up many descriptors at all, and so there are some latent problems
|
|
that you may experience should you start running Apache with many
|
|
descriptors (<EM>i.e.</EM>, with many virtual hosts).
|
|
|
|
<P>The operating system enforces a limit on the number of descriptors
|
|
that a program can have open at a time. There are typically three limits
|
|
involved here. One is a kernel limitation, depending on your operating
|
|
system you will either be able to tune the number of descriptors available
|
|
to higher numbers (this is frequently called <EM>FD_SETSIZE</EM>). Or you
|
|
may be stuck with a (relatively) low amount. The second limit is called
|
|
the <EM>hard resource</EM> limit, and it is sometimes set by root in an
|
|
obscure operating system file, but frequently is the same as the kernel
|
|
limit. The third limit is called the <EM>soft
|
|
resource</EM> limit. The soft limit is always less than or equal to
|
|
the hard limit. For example, the hard limit may be 1024, but the soft
|
|
limit only 64. Any user can raise their soft limit up to the hard limit.
|
|
Root can raise the hard limit up to the system maximum limit. The soft
|
|
limit is the actual limit that is used when enforcing the maximum number
|
|
of files a process can have open.
|
|
|
|
<P>To summarize:
|
|
|
|
<CENTER><PRE>
|
|
#open files <= soft limit <= hard limit <= kernel limit
|
|
</PRE></CENTER>
|
|
|
|
<P>You control the hard and soft limits using the <CODE>limit</CODE> (csh)
|
|
or <CODE>ulimit</CODE> (sh) directives. See the respective man pages
|
|
for more information. For example you can probably use
|
|
<CODE>ulimit -n unlimited</CODE> to raise your soft limit up to the
|
|
hard limit. You should include this command in a shell script which
|
|
starts your webserver.
|
|
|
|
<P>Unfortunately, it's not always this simple. As mentioned above,
|
|
you will probably run into some system limitations that will need to be
|
|
worked around somehow. Work was done in version 1.2.1 to improve the
|
|
situation somewhat. Here is a partial list of systems and workarounds
|
|
(assuming you are using 1.2.1 or later):
|
|
|
|
<DL>
|
|
|
|
<DT><STRONG>BSDI 2.0</STRONG>
|
|
<DD>Under BSDI 2.0 you can build Apache to support more descriptors
|
|
by adding <CODE>-DFD_SETSIZE=nnn</CODE> to
|
|
<CODE>EXTRA_CFLAGS</CODE> (where nnn is the number of descriptors
|
|
you wish to support, keep it less than the hard limit). But it
|
|
will run into trouble if more than approximately 240 Listen
|
|
directives are used. This may be cured by rebuilding your kernel
|
|
with a higher FD_SETSIZE.
|
|
<P>
|
|
|
|
<DT><STRONG>FreeBSD 2.2, BSDI 2.1+</STRONG>
|
|
<DD>Similar to the BSDI 2.0 case, you should define
|
|
<CODE>FD_SETSIZE</CODE> and rebuild. But the extra
|
|
Listen limitation doesn't exist.
|
|
<P>
|
|
|
|
<DT><STRONG>Linux</STRONG>
|
|
<DD>By default Linux has a kernel maximum of 256 open descriptors
|
|
per process. There are several patches available for the
|
|
2.0.x series which raise this to 1024 and beyond, and you
|
|
can find them in the "unofficial patches" section of <A
|
|
HREF="http://www.linuxhq.com/">the Linux Information HQ</A>.
|
|
None of these patches are perfect, and an entirely different
|
|
approach is likely to be taken during the 2.1.x development.
|
|
Applying these patches will raise the FD_SETSIZE used to compile
|
|
all programs, and unless you rebuild all your libraries you should
|
|
avoid running any other program with a soft descriptor limit above
|
|
256. As of this writing the patches available for increasing
|
|
the number of descriptors do not take this into account. On a
|
|
dedicated webserver you probably won't run into trouble.
|
|
<P>
|
|
|
|
<DT><STRONG>Solaris through 2.5.1</STRONG>
|
|
<DD>Solaris has a kernel hard limit of 1024 (may be lower in earlier
|
|
versions). But it has a limitation that files using
|
|
the stdio library cannot have a descriptor above 255.
|
|
Apache uses the stdio library for the ErrorLog directive.
|
|
When you have more than approximately 110 virtual hosts
|
|
(with an error log and an access log each) you will need to
|
|
build Apache with <CODE>-DHIGH_SLACK_LINE=256</CODE> added to
|
|
<CODE>EXTRA_CFLAGS</CODE>. You will be limited to approximately
|
|
240 error logs if you do this.
|
|
<P>
|
|
|
|
<DT><STRONG>AIX</STRONG>
|
|
<DD>AIX version 3.2?? appears to have a hard limit of 128 descriptors.
|
|
End of story. Version 4.1.5 has a hard limit of 2000.
|
|
<P>
|
|
|
|
<DT><STRONG>SCO OpenServer</STRONG>
|
|
<DD>Edit the
|
|
<CODE>/etc/conf/cf.d/stune</CODE> file or use
|
|
<CODE>/etc/conf/cf.d/configure</CODE> choice 7
|
|
(User and Group configuration) and modify the <CODE>NOFILES</CODE> kernel
|
|
parameter to a suitably higher value. SCO recommends a number
|
|
between 60 and 11000, the default is 110. Relink and reboot,
|
|
and the new number of descriptors will be available.
|
|
|
|
<P>
|
|
|
|
<DT><STRONG>Compaq Tru64 UNIX/Digital UNIX/OSF</STRONG>
|
|
<DD><OL>
|
|
<LI>Raise <code>open_max_soft</code> and <code>open_max_hard</code>
|
|
to 4096 in the proc subsystem.
|
|
Do a man on sysconfig, sysconfigdb, and sysconfigtab.
|
|
<LI>Raise <code>max-vnodes</code> to a large number which is greater
|
|
than the number of apache processes * 4096
|
|
(Setting it to 250,000 should be good for most people).
|
|
Do a man on sysconfig, sysconfigdb, and sysconfigtab.
|
|
<LI>If you are using Tru64 5.0, 5.0A, or 5.1, define
|
|
<code>NO_SLACK</code> to work around a bug in the OS.
|
|
<code>CFLAGS="-DNO_SLACK" ./configure</code>
|
|
</OL>
|
|
|
|
<P>
|
|
|
|
<DT><STRONG>Others</STRONG>
|
|
<DD>If you have details on another operating system, please submit
|
|
it through our <A HREF="http://www.apache.org/bug_report.html">Bug
|
|
Report Page</A>.
|
|
<P>
|
|
|
|
</DL>
|
|
|
|
<P>In addition to the problems described above there are problems with
|
|
many libraries that Apache uses. The most common example is the bind
|
|
DNS resolver library that is used by pretty much every unix, which
|
|
fails if it ends up with a descriptor above 256. We suspect there
|
|
are other libraries that similar limitations. So the code as of 1.2.1
|
|
takes a defensive stance and tries to save descriptors less than 16
|
|
for use while processing each request. This is called the <EM>low
|
|
slack line</EM>.
|
|
|
|
<P>Note that this shouldn't waste descriptors. If you really are pushing
|
|
the limits and Apache can't get a descriptor above 16 when it wants
|
|
it, it will settle for one below 16.
|
|
|
|
<P>In extreme situations you may want to lower the low slack line,
|
|
but you shouldn't ever need to. For example, lowering it can
|
|
increase the limits 240 described above under Solaris and BSDI 2.0.
|
|
But you'll play a delicate balancing game with the descriptors needed
|
|
to serve a request. Should you want to play this game, the compile
|
|
time parameter is <CODE>LOW_SLACK_LINE</CODE> and there's a tiny
|
|
bit of documentation in the header file <CODE>httpd.h</CODE>.
|
|
|
|
<P>Finally, if you suspect that all this slack stuff is causing you
|
|
problems, you can disable it. Add <CODE>-DNO_SLACK</CODE> to
|
|
<CODE>EXTRA_CFLAGS</CODE> and rebuild. But please report it to
|
|
our <A HREF="http://www.apache.org/bug_report.html">Bug
|
|
Report Page</A> so that
|
|
we can investigate.
|
|
|
|
<!--#include virtual="footer.html" -->
|
|
</BODY>
|
|
</HTML>
|