Ab吞吐量测试,为何nginx却不如 apache
环境
系统 win7 x64 8G内存 ADM7750双核
对比
1) Apache 2.4.9 + php5.5.12 ts vc11
2) NGINX 1.6.2 + PHP-FPM
代码
<?php
# http://localhost/hello.php
echo "hello";
<!-- http://localhost/js.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body></html>
测试
./ab -c10 -n1000 http://localhost/hello.php
./ab -c10 -n1000 http://localhost/js.html
结果
js.html hello.php
nginx 0.907sec 1102/sec timeout error
apache 0.695sec 1439/sec 0.198s 1089/sec
疑问
现在所有的都推荐 nginx,可为什么nginx的吞吐量无论是 纯HTML 还是 单独的PHP都比不过Apache
UGC 的平台 更适合于 Apache 还是 nginx?
Answers
windows 不能说明任何事。windows 下只用做测试仅此而已。
Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation layer). Only the select() connection processing method is currently used, so high performance and scalability should not be expected. Due to this and some other known issues version of nginx for Windows is considered to be a beta version.
Windows 没有 epoll 和 kqueue,nginx 在 Windows 上用 select 表现自然不佳。
楼主亲自测试验证是个好习惯,但是一般都是采用Linux作为nginx的服务器。使用window的话nginx性能可能还不及apache,应该nginx和apache在windows上都是采用同样的运行机制select,类似排队循环处理。
windows下nginx表现慢可能是:nginx 还需要调用php-cgi ,而 apache内置集成了php的sapi。
而在linux下,apache依然是select,nginx可采用epoll,那么:
apache 依然排队处理
nginx 的epoll机制,来一个请求,扔给php-cgi,然后接着下一个请求。当php-cgi处理完了在返回给客户端就行了。这样就并行起来了。
楼主可以看看 epoll和apache区别:
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。
select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。
而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。
如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。
同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。
Windows 7 上 IIS 和 Apache 性能对比测试
IIS + php-cgi.exe(NTS) vs Apache + php5apache2_4.dll(TS)
环境(64位Win7): IIS7+PHP5.4(NTS非线程安全版本) vs Apache2.4(32位)+PHP5.4
静态文件性能:
ab -k -c100 -n10000 http://127.0.0.1/info.htm # IIS RPS 1709
ab -k -c100 -n10000 http://127.0.0.1:8080/info.htm # Apache RPS 1847
结论:基于APR运行时和WinNT多线程的Apache在静态资源处理方面并不比IIS差.
PHP性能:
ab -k -c100 -n10000 http://127.0.0.1/bs.php # IIS RPS 1180
ab -k -c100 -n10000 http://127.0.0.1:8080/bs.php # Apache RPS 1071
结论:Apache使用了线程化的MPM,所以需要使用线程安全版本的PHP,而线程安全检查有一定开销,所以性能要比IIS+PHP-CGI低一些.
Nginx并非基于多线程实现高并发,而是基于epoll(Linux),kqueue(FreeBSD)事件驱动的异步网络IO机制.Nginx在Windows上用的是最原始的select,而不是Windows的IOCP,所以Windows版Nginx仅仅定位于测试和开发.要发挥Nginx真正的性能,必须在Linux或者FreeBSD上.
Apache虽然在Windows上用的也是select的系统调用,但是Apache的WINNT这个MPM是一个多线程的MPM,所以在非高并发(比如100并发)的情况下处理静态资源甚至比IIS还有优势.另外,Apache在Linux上的同样存在使用epoll的MPM,比如2.4系列默认的event MPM,就是一个epoll事件驱动的架构,主进程管理多个工作进程,每个工作进程又有多个线程,使用epoll进行异步网络IO,这是Apache面对Nginx挑战做出的有力回应.