此次作的修正:
1、ab命令的用法修正
2、加入对动态语言处理能力的比较(php)
针对此前的比较,我发现测试命令ab的并发(-c)并非每秒的请求数量,而是每次的请求数量,所以每秒可能有多个并发请求过去,所以得用限定时间周期(-t)选项。这样uptime测出来的CPU 负载也更加准确(注意-n选项一定要在-t选项后面,否则-t选项的默认值为50000,前面设置的-n选项无效)。结果显示,在持续60秒的高并发情况下,web server的负载明显上升。
由于测试繁琐,为省力起见,我只进行keep alive on测试。测试比较仅在apache_event和nginx之间进行比较,测试命令为:
sleep 60s
ab -k -c 1 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 10 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 100 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 200 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 500 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 1000 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep 60s
ab -k -c 1500 -t 60 -n 600000 http://127.0.0.1/ && uptime
sleep用来降低系统负载,间隔以减少前后两次测试的影响;uptime 用来获得前一分钟的CPU负载,测试结果如下:
并发情况下的回复速度
并发情况下相应CPU的负载
很奇怪,这次测试时apache的处理能力就是上不去,而且负载偏高。我发现只要在高并发的情况下(>500)apache很容易就出现reset连接的现象。为此,我不得不提高MaxKeepAliveRequests 的值(原来是100,这次设定为512),但带来的问题是CPU负载急剧升高。同时我又把KeepAliveTimeout 从15秒改为5秒。但从测试结果来看并不明显。由于对apache还不是很熟悉,有些参数的优化还得从长计议啊。nginx没得说,处理能力和负载都是那么棒,而且参数简单。
如果说nginx是青年人的话,那么apache就是中年人了。apache的瞬间爆发力还可以,但是持久性不行。nginx的体力恒定,再多干一小时,又有何妨?(不要遐想哦)
就我所接触到的情况,我觉得两者的性能差异跟设计有关,在apache的event.c的源代码中有这一样一段话:“However, the major disadvantage is that Apache traditionally keeps an entire child process/thread waiting for data from the client. To solve this problem, this MPM has a dedicated thread for handling both the Listenting sockets, and all sockets that are in a Keep Alive status." 虽然他说单线程处理一个客户连接已经解决了,但是从配置上来看,它还是这样的计算公式 ServerLimit * ThreadsPerChild >= MaxClients。我怀疑他还未很好的解决,一个线程处理一个连接和一个线程处理几千个连接,这性能差别是本质性的。还有这句话也值得回味:“The MPM assumes the underlying apr_pollset implmentation is somewhat threadsafe.”
所以我觉得要想获得高并发性能的web server,就不要选apache了。他不是用来做这个的,他更多是用来做后台的应用服务器。
静态的比较做好了,那么动态语言的处理能力呢?
我分别用apache的prefork+mod_php5、worker+fcgid和event+fcgid进行比较。测试命令为:
sleep 60s
ab -k -c 1 -t 60 -n 60000 http://127.0.0.1/fcgid/test.php && uptime
sleep 60s
ab -k -c 10 -t 60 -n 60000 http://127.0.0.1/fcgid/test.php && uptime
sleep 60s
ab -k -c 100 -t 60 -n 60000 http://127.0.0.1/fcgid/test.php && uptime
sleep 60s
ab -k -c 200 -t 60 -n 60000 http://127.0.0.1/fcgid/test.php && uptime
测试结果如下:
并发情况下的回复速度
并发情况下相应CPU的负载
性能还是prefork+mod_php5最强,不过我觉得Nginx的fastcgi在性能和负载上的兼顾上做得也不赖。
测试环境:
1、测试机器:Linux yaoweibin-desktop 2.6.25.10#3 SMP Thu Jul 17 16:59:44 CST 2008 i686 GNU/Linux
Intel P4 3.0,内存512M,ubuntu 7.10,VMvare6.0.3
系统参数修改:ulimit -SHn 51200
由于环境窘迫,先拿本机回路作测试吧,最好是把测试服务器和客户机分离。
2、测试的网页源码:
静态
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Webserver test</title>
</head>
<body>
This is a webserver test page.
</body>
</html>
动态:
<html>
<head><title>Php test with phpinfo()</title></head>
<body>
<?
phpinfo();
?>
</body>
</html>
3、apache2.2.4的主要测试配置:
MaxKeepAliveRequests 512
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>ThreadLimit 32
ServerLimit 128
StartServers 8
MaxClients 4096
ThreadsPerChild 32
</IfModule>
<IfModule mpm_event_module>
ThreadLimit 256
ServerLimit 256
StartServers 8
MaxClients 10000
ThreadsPerChild 256
MaxRequestsPerChild 10000
</IfModule>
nginx0.6.32的主要配置:
worker_processes 8;
events {
use epoll;
worker_connections 10240;
}
4、测试过程基本上每次测试完毕,将虚拟机重启一次。
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。