Tested Web Server Software
The following web servers are included in the web server performance test.
- Apache 1.3.33
- Apache 2.0.52 (prefork mpm)
- IIS 6.0
- LiteSpeed 2.0 Standard
- LiteSpeed 2.0 Professional
- thttpd 2.25b
- TUX 3.2
- boa 0.94.14rc20
- lighttpd 1.3.12
- Aolserver 4.0.7
- Mathopd 1.5p3
We'd like to include Zeus and SunOne in the benchmark test as well, however,
their license agreements do not allow us to publish any benchmark results, so
we skipped them.
You are welcome to share your test results on our forum if you have the resource
to perform a benchmark test like ours. We believe a lot of people are interested.
Test Environment
Network Switch: D-Link Gigabit Eight Ports Switch DGS-1008D
Server Hardware: Dell PowerEdge SC1600
- CPU: Single Intel Xeon 2.4GHz/533FSB/512KB L2 Cache
- memory: 256MB ECC PC2700
- Hard Drive: 36GB 10K RPM SCSI drive Seagate ST336607LW
- NIC: on board Intel PRO/1000 Gigabit Adapter
Server Software:
- Fedora Core 3 with stock kernel 2.6.10-1.760
- IIS 6.0 on Windows 2003 Enterprise
Web Server Configurations:
Note: Both LiteSpeed and lighttpd support the new I/O event dispatcher sys_epoll()
in 2.6 kernel, but interestingly, we found that for both server, the benchmark
results are not as good as that with standard event dispatcher poll(), at least
when tests are performed across network with concurrent level <=1000. So
we just use poll() in all of our tests. The results could be completely different
for local loopback tests.
Client Hardware: MSI K7D
- CPU: Dual Athlon MP 2000+/266FSB/256KB L2 Cache
- memory: 1GB PC2100
- Hard Drive: 36GB 1000RPM SCSI drive
- NIC: Intel PRO/1000 Gigabit
Client Software:
- OS: RedHat 8.0 with kernel 2.4.22smp
- Test Tool: ApacheBench (ab) 1.3.33
Results
Each test case was run three times, and the best result is used. Server was
rebooted after testing each server software.
Small static file benchmark
A small static file with 100 bytes
in size is used in this test. The reasons of using a small file are: to avoid
network bandwidth bottleneck, to reveal the performance of web server software
instead of kernel.
Non-KeepAlive test: ab -n 100000 -c <concurrent
level> http://<ip>:<port>/100.html

| 1 |
1051 |
1081 |
1437 |
1300 |
1413 |
1446 |
1264 |
1281 |
1118 |
1217 |
1280 |
| 10 |
2987 |
2851 |
7416 |
9202 |
9300 |
9653 |
7697 |
9254 |
4143 |
7187 |
8145 |
| 100 |
3021 |
2874 |
-* |
11232 |
14566 |
18601 |
9451 |
10998 |
4020 |
9584 |
9404 |
| 200 |
2981 |
2851 |
-* |
10968 |
14184 |
17418 |
9330 |
10708 |
3850 |
9441 |
9260 |
| 1000 |
2988 |
2909 |
-* |
10330 |
13229 |
16417 |
8995 |
10430 |
2835 |
9260 |
9133 |
* There must be some kind of Anti-DoS feature in IIS 6.0, it drops all connections
when concurrent level is higher than 10.
KeepAlive test: ab -n 100000 -c <concurrent
level> -k http://<ip>:<port>/100.html

| 1 |
2621 |
2350 |
3297 |
3409 |
3740 |
3525 |
1242 |
3136 |
2679 |
3116 |
3140 |
| 10 |
5122 |
4744 |
20153 |
20933 |
23073 |
21440 |
7742 |
19215 |
6919 |
13833 |
16570 |
| 100 |
5163 |
4673 |
33025 |
24576 |
45703 |
53304 |
9361 |
17253 |
7564 |
14697 |
17094 |
| 200 |
5094 |
4617 |
30721 |
23752 |
41237 |
40485 |
9266 |
16730 |
8149 |
14265 |
16313 |
| 1000 |
4837 |
4644 |
27427 |
16756 |
37271 |
32905 |
8844 |
15475 |
6888 |
13041 |
15037 |
CGI benchmark
A simple C CGI script (echo) is used in this test. It is the C CGI/FCGI example
in fcgi 2.4 package which prints out all CGI environment variables.
CGI Test: ab -n 3000 -c <concurrent level>
http://<ip>:<port>/cgi-bin/echo

| 1 |
304 |
319 |
450 |
481 |
40* |
303 |
298 |
348 |
461 |
| 10 |
340 |
368 |
529 |
581 |
38* |
373 |
310 |
436 |
667 |
| 100 |
338 |
356 |
384 |
569 |
40* |
373 |
257 |
395 |
623 |
| 200 |
321 |
350 |
262 |
566 |
36* |
351 |
272 |
364 |
563 |
* Don't know what's wrong with thttpd's CGI performance
Fast CGI benchmark
A simple C++ Fast CGI script (echocpp) is used in this test, it is a modified
version of the C++ FCGI example in fcgi 2.4 package. It has been modified to
only generate a constant response with 162 bytes in the response body. The part
that changes from request to request has been removed because ApacheBench does
not like responses with variable response body size.
Fast CGI Test: ab -n 10000 -c <concurrent
level> http://<ip>:<port>/cgi-bin/echo

| 1 |
814 |
808 |
1019 |
1164 |
1071 |
| 10 |
1733 |
1706 |
4500 |
6064 |
4334 |
| 100 |
1753 |
1733 |
5030 |
6020 |
4006 |
| 200 |
1656 |
1661 |
4856 |
5955 |
4078 |
| 1000 |
1862 |
1806 |
4737 |
5773 |
3529 |
PHP script benchmark: mod_php vs.
FastCGI PHP
Two simple PHP scripts are used in this test, one is hello.php
which prints out "hello world", another one is phpinfo.php
which only calls phpinfo(). There is no PHP opcode accelerator configured for
all servers as it does not have big performance impact for those two simple
php scripts.
hello.php
test: ab -n 10000 -c <concurrent level> http://<ip>:<port>/hello.php

| 1 |
678 |
726 |
733 |
837 |
646 |
| 10 |
1399 |
1392 |
2117 |
2460 |
1401 |
| 100 |
1417 |
1410 |
2014 |
2601 |
1655 |
| 200 |
1420 |
1409 |
1956 |
2556 |
1714 |
| 1000 |
1432 |
1434 |
1930 |
2400 |
1593 |
phpinfo.php
test: ab -n 10000 -c <concurrent level> http://<ip>:<port>/phpinfo.php

| 1 |
381 |
372 |
473 |
483 |
376 |
| 10 |
420 |
435 |
627 |
655 |
428 |
| 100 |
418 |
433 |
609 |
632 |
423 |
| 200 |
418 |
428 |
605 |
629 |
420 |
| 1000 |
417 |
425 |
592 |
623 |
399 |
Perl script benchmark: mod_perl vs.
lsperld
A Hello World Perl script, which generates a response with 77 bytes in the
response body, is used in this test. Apache 2.0 is not tested as there are too
much trouble to install mod_perl for both Apache 1.3 and 2.0 on the same server.
Apache 1.3 is configured to use Apache::Registry to handle perl scripts.
Lsperld is a Perl Fast CGI script which can run CGI perl script in a persistent
Perl interpreter, just like Apache mod_perl's Apache::Registry, compiled perl
script is cached in memory.
hello.pl
test: AB -n 10000 -c <concurrent level> http://<ip>:<port>/hello.pl

| 1 |
647 |
759 |
840 |
| 10 |
1143 |
1600 |
2004 |
| 100 |
1144 |
2006 |
2240 |
| 200 |
1140 |
2032 |
2297 |
| 1000 |
1167 |
1965 |
2207 |
Conclusion
We got the following conclusion based on above benchmark results:
- Performance of Apache 1.3 and 2.0 are very close. There is no performance
advantage for 2.0 at all. We did not test the other worker MPM of Apache 2.0
as it is more likely that prefork MPM will be used in production on Unix/Linux
system.
- Comparing to Apache, LiteSpeed Web Server are up to 3-7 times faster when
serving static content, and up to 50-100% faster when serving dynamic content,
including CGI, FastCGI, PHP and Perl. Our earlier
test shows that Apache's performance degrades even further when distributed
configuration override (.htaccess) is enabled, however, LiteSpeed web server
is barely affected. So, we will see even larger performance difference in
a shared hosting environment.
- Comparing to those pure user land content accelerator like thttpd, boa and
mathopd, LiteSpeed Web Server has much better performance in serving static
content.
- Comparing to lighttpd, LiteSpeed Standard Edition has better performance
in almost all tests.
- Comparing to the kernel content accelerator, TUX, thank to its in-kernel
shortcut and simple feature set, LiteSpeed Web Server Pro is slightly slower
in the non-keep-alive test, but is able to catch up in the keep-alive test.
- The overall performance of LiteSpeed web server, including both Standard
and Professional Editions, is better than all other web server software tested.
LiteSpeed Web Server is a one-stop solution for high performance web serving
environment. If you really want your web site stop suffering from all kinds
of performance problems, and bring the most out of your existing server hardware,
you should seriously consider switching to LiteSpeed. It will save all your
headaches on optimizing your web infrastructure, as we have done all the hard
work for you already.
|