Windows 2000 与 Linux 的 Web 效能评比
本文作者: wilson
硬件环境与测试项目
这阵子 Windows 2000 刚问世,Microsoft 的市值却跌落到第三名,Linux 的成长更加的快速。看到许多测试报告,趁工作之便,花了二天,也对 Windows 2000 及 Linux 做了一些实验。
在看下面的资讯之前,首先要声明的是,这些实验都很粗糙,只有一台服务器与一台客户端,同时在封闭的区域网络中。实际的 Web Server 和 Client 在 0WAN 上,任何情形都会影响服务器的效能。也唯有在现实环境下,才是真正的系统效能,实验的都是温室中的情形,不代表实际执行的结果。
再次声明,结果不代表什么意义,因为是粗糙的实验嘛,看看就算了,任何实验数字,均是实验。
同时笔者在测试时,没有拿到 M$ 或是其它阵营的一毛钱 (要给笔者钱的话,嘻嘻,请还是捐给 Linuxfab 或是 FSF 吧)。实际上,笔者还很有私心地袒护 Linux ...口可...口可...口可。原以为结果会一面倒向 Linux,结果却不然....
--------------------------------------------------------------------------------
受测硬件:
Compaq ProLiant 3000
Intel Pentium II 450 CPU
10000rpm 9GB SCSI HDD
640MB SDRAM
网络环境:
AvSys Switch HUB
100baseTX Fast Ethernet Cable
受测平台:
Windows 2000 Server 中文版
Slackware Linux 7.0 (SMP Kernel 使用光碟的 /Kernels/Smp.s/bzImage )
测试项目:
Web 端 CGI 计算及巢状回圈: 九九乘法表
大档案传输: sample.asf (Windows 2000 的多媒体范例)
Web 端 CGI 执行时读档: include
注:
Windows 2000 系统及相关伺服均未做微调。
Linux 系统未做微调,Apache 1.3.12 source 的 ~/src/include/httpd.h
#define HARD_SERVER_LIMIT 256 改成
#define HARD_SERVER_LIMIT 1024
PHP 4.0b4pl1 并加入 Zend Optimizer
测试的 Client 使用 Slackware Linux 7.0 及 Apache 的 AB 测试软件 (ApacheBench),并使用非常大的连线数目。指令如下
./ab -n 50000 -c 200 首页URL
测试项目一:巢状回圈处理
Win2K Linux
9x9.asp (2464 bytes) 9x9.php (2265 bytes)
Dual CPU Single CPU Dual CPU Single CPU
Concurrency Level 200
Time taken for tests (sec.) 299.691 285.061 173.879 258.632
Complete requests 50000
Total transferred (byte) 135463545 135452709 122750000 122750000
HTML transferred (byte) 123212320 123202464 113250000 113250000
Requests per second 166.84 175.40 287.56 193.32
Transfer rate (kb/s) 452.01 475.17 705.95 474.61
Connect (min/avg/max) (ms) 0/9/9049 0/1/3005 0/476/45007 0/6/9000
Processing (min/avg/max) (ms) 73/1187/13222 91/1136/1248 25/205/57 62/1005/180030
Total (min/avg/max) (ms) 73/1196/22271 91/1137/4253 25/681/45064 62/1011/189030
这个测试项目,主要是要测试 Web Server 端的 Script 引擎的效能。使用双巢状回圈的九九乘法表做为测试的项目,由于双巢状回圈可以马上的看出程序语言的效能,虽然只有跑 9x9 次回圈,不过在重覆了五万次时,可以将差距拉开。
Concurrency Level 的值为二百,表示 Client 端模拟成二百个使用者同时使用。Complete requests 表示执行的连线数目,这个测试为五万次。
在这个测试项目上,PHP 的 Zend 引擎没有令人失望。无论在单 CPU 及双 CPU,Linux 的表现都令人感到兴奋。
Linux 在单 CPU 的情形下,/proc/loadavg 中的系统负载,竟然高达 95.xx 以上,再加一颗 CPU,变双 CPU 之后,CPU 终于有喘息的馀地。这情形说明 Zend 引擎虽然效能很好,但是也因为效率太好了,将 CPU 完全的榨乾,使得系统没有馀力负担其它的工作。
对于 Web Server 以跑 PHP 做为后端平台的系统而言,最好使用双 CPU 的机器当作服务器。在没有装双 CPU 的情形之下。可能会让系统无法负担其它的责任。
在测试时,因为测试环境的 Switch Hub 有类似等化器的灯号显示,可以很明显地看到 Linux 的双 CPU 状态,流量高达 90% 以上,Linux 单 CPU 的情形,也有 80% 的高流量。在 WindowsNT 的情形,却只有 60% 左右的流量。也就是说,Linux 双 CPU 时,一张网卡还无法将 Zend 引擎的处理结果送出,由于没有测二张网卡 Trunk 的情形,所以无法确实地让 Zend 处理到它的极速。不过说不定在 Trunk 网络卡后,还要更多的 CPU 才能让 Zend 完全发挥。
而 ASP 方面的处理效能,实在不意外。在 OpenSource 社群与商业软件霸主的圣战中,PHP 直接突破霸主的封锁线,而且完全没有追兵,这真是小兵立大功的奇迹。不禁佩服 PHP 的开发团队,虽然没有商业的对手 (就是指 M$ 没有足以匹敌的软件),还能保持活力,不断的进步。
以下是测试的 Script 程序源代码
--------------------------------------------------------------------------------
9x9.asp 原始程序码
<html><br>
<head><br>
<title>ASP 九九乘法表</title><br>
</head><br>
<body><br>
<table border=1><br>
<%for i = 1 to 9 %><br>
<tr><br>
<% for j = 1 to 9 %><br>
<td nowrap><% = i %> x <% = j %> = <% = i * j %></td><br>
<% next %><br>
</tr><br>
<%next%><br>
</table><br>
</body><br>
</html><p><hr size=1><p>
9x9.php 原始程序码
<html><br>
<head><br>
<title>PHP 九九乘法表</title><br>
</head><br>
<body><br>
<table border=1><br>
<?php<br>
for($x=1;$x<=9;$x=$x+1) {<br>
echo \"<tr>\";<br>
for($y=1;$y<=9;$y=$y+1)<br>
echo \"<td nowrap>$x x $y = \".$x*$y.\"</td>\";<br>
echo \"</tr>\";<br>
};<br>
?><br>
</table><br>
</body><br>
</html>
测试项目二:大档案传输
sample.asf
(1147675 bytes) Win2K Linux
Dual CPU Single CPU Dual CPU Single CPU
Concurrency Level 180
Time taken for tests (sec.) 1092.365 1093.009 1172.002 1175.478
Failed requests 28 27
Complete requests 1000
Total transferred (byte) 1235100768 1235989840 1214926700 1217716768
HTML transferred (byte) 1234849128 1235738200 1214615736 1217405804
Requests per second 0.92 0.91 0.85 0.85
Transfer rate (kb/s) 1130.67 1130.81 1036.63 1035.93
Connect (min/avg/max) (ms) 8/1279/2216 8/1226/4564 9/2147/25151 8/1085/21151
Processing (min/avg/max) (ms) 175381/181000/196331 176975/181100/194522 36421/182649/853812 60324/183655/619807
Total (min/avg/max) (ms) 175389/182279/198547 176983/182326/199086 36430/184796/878963 60332/184740/640958
这个测试项目,主要是要测试 Web Server 端的档案传输的效能。使用的档案为 Windows2000 所附的多媒体范例档案。
Concurrency Level 的值为一百八,表示 Client 端模拟成一百八十个使用者同时使用。Complete requests 表示执行的连线数目,这个测试为一千次。这个测试数目比前一个九九乘法表少的原因是因为要测五万次的话,可能真的要很久很久。
这个项目的结果真是令开放社群的支持者感到不可思议,完全不敢相信这会是真的,连 Failed requests 都出现了。反之,Win2K 的支持者可能会觉得高兴吧?不过 Linux 玩家也不用太失望,反正 Kernel 2.4.x 也快出来了,届时在系统的效能方面,想必有更好的调整。而这个传输项目的结果,单 CPU 和多 CPU 感觉不出有什么差别。看 Switch Hub,都是 90% 以上的流量。
推算 Linux 在这个项目会输 Win2K 的原因,可能是 Win2K 的 Web Server 有充分利用 Cache Memory。同时在操作系统的方面,Win2K 的 Winsock、执行绪及开档能力在出货时可能有做最大化或者最佳化的调整。而 Linux Kernel 2.2.x 在这方面没有调校,同时 Linux Kernel 内定的 MAX_TASKS_PER_USER 实在太小了 (在 include/linux/task.h),若将它从 512 加到 4092,在多 CPU 的环境下应可以让效能有明显的改善。
因此,若只单纯拿来做静态的站点,完全没有用到 ASP、PHP 或其它 CGI 程序的话,同时在不调校系统的情形,Windows 2000 Server 目前比 Slackware Linux 7.0 的效能还要好。对一个 OpenSource 社群的支持者,这实在是有点闷。不过反过来想想,微软丢那么多钱,还是有在为它们的系统做 Turnning 的工作。而身为 Linux 的玩家,应依需要调校电脑才是真正的 Linux 高手。
测试项目三:引入小档案
Win2K Linux
include.asp (28355 bytes) include.php (28349 bytes)
Dual CPU Single CPU Dual CPU Single CPU
Concurrency Level 180
Time taken for tests (sec.) 1379.481 1376.948 1416.06 1417.554
Complete requests 50000
Total transferred (byte) 1430972720 1430984316 1428227136 1428415376
HTML transferred (byte) 1418652056 1418657502 1418706236 1418891816
Requests per second 36.25 36.31 35.31 35.27
Transfer rate (kb/s) 1037.33 1039.24 1008.59 1007.66
Connect (min/avg/max) (ms) 0/969/3889 2/951/3502 7/510/45136 8/550/93136
Processing (min/avg/max) (ms) 30/3989/7944 46/3998/8589 378/4494/609151 157/4458/473420
Total (min/avg/max) (ms) 30/4958/11833 48/4949/12091 385/5004/654287 165/5008/566556
这个测试项目,主要是要测试 Web Server 端的档案 I/O 的效能及引入小档案的效能。使用的档案为 Windows2000 所附的档案 (winntsystem32*.txt)。
Concurrency Level 的值为一百八,表示 Client 端模拟成一百八十个使用者同时使用。Complete requests 表示执行的连线数目,这个测试为五万次。
这个项目的结果再令开放社群的支持者感到不可思议。同时竟然单 CPU 的 Win2K 会比双 CPU 来得好,相信连 Win2K 的爱用者也会感到惊奇。看 Switch Hub,都是 90% 以上的流量。
猜想单 CPU 的 Win2K 会赢的原因,可能是开小档案,要一直切换执行绪,同时也要 I/O 硬盘机,而双 CPU 的环境下,并没有做最佳化的 Patch,造成 CPU 执行绪间的等待,而单 CPU 的环境就比较没有这种情形。
而 Linux 会输,可能还是和上个项目的原因一样,若对系统调校过的话,可能会有不同的结果。(对系统的调校,比弃保效应更能引起变天?)
在这三个实验,还有个有趣的现象,处理时间占上风的,连线时间 (Connect) 必定较长。这也是蛮好玩的现象,值得探讨。
--------------------------------------------------------------------------------
include.asp 原始程序码
<html><br>
<head><br>
<title>ASP Include</title><br>
</head><br>
<body><br>
<!--#include file=\"enceula.txt\"--><br>
<p><hr><p><br>
<!--#include file=\"encread.txt\"--><br>
<p><hr><p><br>
<!--#include file=\"eula.txt\"--><br>
<p><hr><p><br>
<!--#include file=\"sfmuam.txt\"--><br>
</body><br>
</html>
--------------------------------------------------------------------------------
include.php 原始程序码
<html><br>
<head><br>
<title>PHP Include</title><br>
</head><br>
<body><br>
<? include \"enceula.txt\" ?><br>
<p><hr><p><br>
<? include \"encread.txt\" ?><br>
<p><hr><p><br>
<? include \"eula.txt\" ?><br>
<p><hr><p><br>
<? include \"sfmuam.txt\" ?><br>
</body><br>
</html>
结论
对习惯于 Windows 系列的爱用者而言或根本不想调校系统的服务器管理员,Windows 2000 恐怕是个不错的主意,尤其在静态网页,只要不涉及 CGI 程序的运算,Windows 2000 在区域网络上都有不错的表现,至于 Internet 就不敢保证了,连 Windows 官方站点的效能都有待商榷。
至于 Linux 方面,还有许多的成长空间。系统没有经过调校时,区域网络静态网页,效能甚至还不如 Windows 2000。不过只要一加上动态网页,只要简单的回圈,马上就令 Linux 玩家扬眉吐气。更复杂的 CGI 程序,就是 Linux + Apache + PHP4 表现的空间了。
或许有人会问,那用 Windows 2000 加上 Apache 加上 PHP4 呢?这个问题的解答,可能要等热心的玩家来回答了。
发布人:Crystal 来自:LinuxFab