From: Mike Rumph and a request is made for the URI and a request is made for the URI This at least avoids the extra checks for the
If at all possible, avoid content negotiation, if you're
+ If at all possible, avoid content negotiation if you're
really interested in every last ounce of performance. In
practice the benefits of negotiation outweigh the performance
penalties. There's one case where you can speed up the server.
@@ -281,7 +281,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
In situations where Apache 2.x needs to look at the contents
of a file being delivered--for example, when doing server-side-include
- processing--it normally memory-maps the file, if the OS supports
+ processing--it normally memory-maps the file if the OS supports
some form of On some platforms, this memory-mapping improves performance.
@@ -317,7 +317,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
In situations where Apache 2.x can ignore the contents of the file
to be delivered -- for example, when serving static file content --
- it normally uses the kernel sendfile support for the file, if the OS
+ it normally uses the kernel sendfile support for the file if the OS
supports the On most platforms, using sendfile improves performance by eliminating
@@ -361,7 +361,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
clients, using the default /index.html
.
- Then Apache will perform lstat(2)
on
+ /index.html
,
+ then Apache will perform lstat(2)
on
/www
, /www/htdocs
, and
/www/htdocs/index.html
. The results of these
lstats
are never cached, so they will occur on
@@ -203,7 +203,7 @@ DocumentRoot "/www/htdocs"
mmap(2)
.sendfile(2)
operation.5
would take on
the order of 95 seconds to spawn enough children to handle
- the load. This works fine in practice on real-life servers,
+ the load. This works fine in practice on real-life servers
because they aren't restarted frequently. But it does really
poorly on benchmarks which might only run for ten minutes.
If, on the other hand, you have modules statically linked
@@ -635,7 +635,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
accomplishing nothing. Meanwhile none of those children are
servicing requests that occurred on other sockets until they
get back up to the select
again. Overall this
- solution does not seem very fruitful, unless you have as many
+ solution does not seem very fruitful unless you have as many
idle CPUs (in a multiprocessor box) as you have idle children
(not a very likely situation).
The above is fine and dandy for multiple socket servers, but
what about single socket servers? In theory they shouldn't
- experience any of these same problems, because all children can
+ experience any of these same problems because all children can
just block in accept(2)
until a connection
arrives, and no starvation results. In practice this hides
almost the same "spinning" behavior discussed above in the
non-blocking solution. The way that most TCP stacks are
implemented, the kernel actually wakes up all processes blocked
in accept
when a single connection arrives. One of
- those processes gets the connection and returns to user-space,
- the rest spin in the kernel and go back to sleep when they
+ those processes gets the connection and returns to user-space.
+ The rest spin in the kernel and go back to sleep when they
discover there's no connection for them. This spinning is
hidden from the user-land code, but it's there nonetheless.
This can result in the same load-spiking wasteful behavior
@@ -750,7 +750,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
an HTTP server to reliably implement the
protocol, it needs to shut down each direction of the
communication independently. (Recall that a TCP connection is
- bi-directional, each half is independent of the other.)
When this feature was added to Apache, it caused a flurry of
problems on various versions of Unix because of shortsightedness.
@@ -893,7 +893,7 @@ DirectoryIndex index.cgi index.pl index.shtml index.html
accept(2)
serialization. On this
particular platform, the worker MPM uses an unserialized accept by
- default, unless it is listening on multiple ports./65: lwp_park(0x00000000, 0) = 0