Home
HSLAB HTTP Monitor Online Help Prev Page Prev Page
HSLAB HTTP Monitor Help System
What's new
What is it
System Requirements
Handy Software Lab Products FAQ
Before You Begin
How it works
Why This Software?
Work With the Program
Main Window
Server Status
Connection and Network Statistics
Content Statistics
Detailed Statistics for Virtual Server (Table)
Virtual Server Connections Distribution
Server Operation
Server Operation Distribution
Countries
Connections by Country
Connections by Host
Monitor Options
Apache Configuration Wizard
Connections Data
Server Profiles
Threshold and Alarms
Advanced Filtering Options
Simple Regexp Syntax
Regular Expressions
Related Apache Documents
Apache Core Features
Module mod_status
Access Control by URL
Apache's Handler Use
Apache Performance Notes
Contacts
Company
Support
Report a bug
License Agreement and Registration
END-USER LICENSE AGREEMENT FOR THIS SOFTWARE
Distribution of Evaluation Version
Why Register?
Unregistered version limitations
Register Online
Enter Registration Code
Related Information
Comma-separated values
Enabling Status Support
Apache HTTP Server

Author: Dean Gaudet

Introduction

Apache is a general webserver, which is designed to be correct first, and fast second. Even so, it's performance is quite satisfactory. Most sites have less than 10Mbits of outgoing bandwidth, which Apache can fill using only a low end Pentium-based webserver. In practice sites with more bandwidth require more than one machine to fill the bandwidth due to other constraints (such as CGI or database transaction overhead). For these reasons the development focus has been mostly on correctness and configurability.

Unfortunately many folks overlook these facts and cite raw performance numbers as if they are some indication of the quality of a web server product. There is a bare minimum performance that is acceptable, beyond that extra speed only caters to a much smaller segment of the market. But in order to avoid this hurdle to the acceptance of Apache in some markets, effort was put into Apache 1.3 to bring performance up to a point where the difference with other high-end webservers is minimal.

Finally there are the folks who just plain want to see how fast something can go. The author falls into this category. The rest of this document is dedicated to these folks who want to squeeze every last bit of performance out of Apache's current model, and want to understand why it does some things which slow it down.

Note that this is tailored towards Apache 1.3 on Unix. Some of it applies to Apache on NT. Apache on NT has not been tuned for performance yet, in fact it probably performs very poorly because NT performance requires a different programming model.

Hardware and Operating System Issues

The single biggest hardware issue affecting webserver performance is RAM. A webserver should never ever have to swap, swapping increases the latency of each request beyond a point that users consider "fast enough". This causes users to hit stop and reload, further increasing the load. You can, and should, control the MaxClients setting so that your server does not spawn so many children it starts swapping.

Beyond that the rest is mundane: get a fast enough CPU, a fast enough network card, and fast enough disks, where "fast enough" is something that needs to be determined by experimentation.

Operating system choice is largely a matter of local concerns. But a general guideline is to always apply the latest vendor TCP/IP patches. HTTP serving completely breaks many of the assumptions built into Unix kernels up through 1994 and even 1995. Good choices include recent FreeBSD, and Linux.

Run-Time Configuration Issues

HostnameLookups

Prior to Apache 1.3, HostnameLookups defaulted to On. This adds latency to every request because it requires a DNS lookup to complete before the request is finished. In Apache 1.3 this setting defaults to Off. However (1.3 or later), if you use any allow from domain or deny from domain directives then you will pay for a double reverse DNS lookup (a reverse, followed by a forward to make sure that the reverse is not being spoofed). So for the highest performance avoid using these directives (it's fine to use IP addresses rather than domain names).

Note that it's possible to scope the directives, such as within a <Location /server-status> section. In this case the DNS lookups are only performed on requests matching the criteria. Here's an example which disables lookups except for .html and .cgi files:

HostnameLookups off

<Files ~ "\.(html|cgi)$>

    HostnameLookups on

</Files>

But even still, if you just need DNS names in some CGIs you could consider doing the gethostbyname call in the specific CGIs that need it.

The CHM file was converted to HTML by chm2web software.