2014-02-20 11:05:02
来 源
IT技术网
Nginx
本文介绍Apache2与Nginx服务器性能测试结果对比,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。

此次作的修正:

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、测试过程基本上每次测试完毕,将虚拟机重启一次。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。