首页 > 代码库 > 巅峰对决:node.js和php性能测试

巅峰对决:node.js和php性能测试

选手介绍:  

node.js,服务端javascript语言,以出色的事件驱动和I/O异步广受关注,它更像一辆性能出色的Mitsubishi Evlution X

php,耳熟能详的服务端语言,在互联网领域中市场占有率相当高,它更像一辆性能出色,品牌知名度高的BMW 330i


驾驶员以及测试员介绍:

 

网络环境:内网

驾驶员(压力测试服务器): 

服务器系统:Linux 2.6.18 

服务器配置:Intel(R) Xeon(TM) CPU 3.40GHz 4 CPUS 

内存:6GB 


测试员(发包服务器): 

发包工具:apache 2.2.19自带的ab测试工具 

服务器系统:Linux 2.6.18 

服务器配置:Pentium(R) Dual-Core CPU E5800 @ 3.20GHz 2CPUS 

内存:1GB 


车辆介绍:

Mitsubishi Evlution X(node.js):以下简称EVO(node)

版本:V0.4.9;

官方提供性能:6985req/sec(http请求);

改装情况:

1、涡轮增压套件:multi-node(在多核服务器上多开node进程提高性能);

2、运动避震和地盘套件:generic-pool(链接池,用以提高对mysql、redis等i/o操作的性能);


BMW 330i(php):以下简称330(php)

版本:5.2.17;

官方提供性能:8220 req/sec(http请求);

改装情况:

宝马御用改装ACSCHNITZER提供:Nginx+FastCgi;


注意:可能我php配置不是最优化,应该还可以再快一些,下面的一些测试配置都是根据网上的文章进行配置的,如果大师级高手来配的话,估计PHP性能还能提升50%左右,所以这个测试数据仅供参考。

配置是根据张宴的博客再根据实际情况修改来的,原文地址:http://blog.s135.com/nginx_php_v6/


序:

对于原厂EVO(node)和经过改装的EVO(node)之间到底性能会差多少?我们让他们在场地上小试一下身手。

测试内容:

分别对redis的一个key值进行get操作,并返回这个值。压力分别在3000、5000、7000,压测30秒。


com 3000/30  3000/30  3000/30 5000/30 5000/30   5000/30 7000/30   7000/30 7000/30 
type  node0  node1 node2   node0  node1 node2  node0  node1  node2 
rps  4025  5479  5262  3913  5283  5353  3823  5258  5269
 tpq  0.24  0.18  0.19  0.26  0.19  0.18  0.26  0.21  0.19
 80%req  63  131  671  448  417  1210  1961  856  1650
 fail  0  0  0  0  0  0  227  0  0

   

说明:(下同)

node0表示原装,node1表示只进行了multi-node改装,node2表示进行了multi-node和generic-pool改装。

 

3000/30:代表命令./ab -c 3000 -t 30 http://10.1.10.150:8888/ 

rps:代表每秒处理请求数,并发的主要指标 

tpq:每个请求处理的时间,单位毫秒。 

fail:代表平均处理失败请求个数 

80%req:代表80%的请求在多少毫秒内返回。 


接下来我们看下对mysql的操作,3者的区别,对mysql的testtable进行select * 操作,testtable有2个字段,1条数据。返回name值为test。


com 3000/30  3000/30  3000/30 5000/30 5000/30   5000/30 7000/30   7000/30 7000/30 
type  node0  node1 node2   node0  node1 node2  node0  node1  node2 
rps 1247  2465  2999  1211  2451  3013 1243 2440  3054
 tpq  0.82  0.40  0.33  0.82  0.41  0.33  0.80  0.42  0.33
 80%req 2424  2080  627  4329  3103  1365  5433  3610  3188
 fail  0  0  0  0  0  0 0  0  0


multi-node的应用显然大大提升了node的性能,连接池只有在特定的情况下才能更好的作用。

如果连接时间越长,操作DB越复杂,例如对redis操作多个key或是排序等,连接池的性能就更能体现出来了。


具体如何对EVO(node)进行改装,详见我的博客:http://snoopyxdy.blog.163.com/blog/static/601174402011841174351/


chapter1:男人之间的战斗,0-400M直线加速

0-400米直线竞速赛又称为“直线加速度赛”,是专为赛车性能而生的比试,没有办法逃避,只能勇往直前。

在空旷的飞机场,EVO(node)330(php)正准备着一场赤手空拳的较量。

测试内容:

对“hello world” web服务器进行测试,空框架,无任何业务负载。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node php  node  php   node php 
 rps  7677  3624  7232  3760  6743  3731
 tpq  0.13  0.39  0.14  0.41  0.15  0.42
 80%req  138  843  477  1343  898  2445
 fail  0  0  0  0  0  0

   

EVO(node)在multi-node的4涡轮增压下(4CPU),一路领先,直到终点,不过在测试中4个CPU一直出于饱和状态,如果有8个核,估计能更快。

而php由于我菜鸟级的配置改装,无法完全发挥他的性能,网上有TX将php裸奔到5000+rps的,大家可以去参考一下。



chapter2:都市街跑,考量你的驾驶技术

跑在都市的路上,经常会看见有两部车子先后从你身边呼啸而过,伴随着引擎轰鸣声的远去,你能感受到速度的激情。犹如我们经常穿梭在繁华的都市内,所以先将生产中最常用到的mysql进行对比测试。

测试内容:

对数据表test进行select * 操作,test数据表内只有一条数据,2个字段,然后返回name,值为test。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node  php   node   php   node  php 
 rps  2999  1293  3013  1349  3054  1301
 tpq  0.33  0.82  0.33  0.80  0.33  0.80
 80%req  627  1369  1365  1979  3188  3903
 fail  0  0  0  111  0  573


mysql是建立和释放连接都比较长的,所以node和php性能相比裸奔都大幅下降。

由于php每次请求都需要建立释放连接,所以耗时更长。

EVO(node)在这时的优势就发挥出来了,multi-node和generic-pool两大利器无缝合作,在街头巷尾远远的甩开了330(php)

还是那句老话,可能php改装的不到位,各位做个参考把。


chapter3:城市高架,隧道口,匝道上都是我们展现速度的舞台

高架的诞生是为缓和日益阻塞的城市交通,高架上不仅是豪车的天下,更是性能车的舞台,让我们去体验砸道秒杀一切的快感吧。

memcache是作为缓解mysql瓶颈的最佳工具,php+memcache+mysql一直是很经典的组合,广泛用于各大互联网站点内。

测试内容:

对memcache的“test”key取值,然后返回这个值“test”。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node  php   node   php   node  php 
 rps  5102  1957  4995  1841  4976  1872
 rpt  0.2  0.64  0.2  0.74  0.19  0.70
 80%req  672  1713  1033  2150  1494  3551
 fail  0  7  0  79  0  335


和mysql对比,memcache建立和释放连接时间要更短,而且直接操作内存,所以两者的测试结果都有不少的上升。

这里php还是受限于他建立和释放连接的损耗,成绩不理想。


chapter4:决战纽博格林

真正的赛车都必须去征服赛道之王——德国纽博格林北环赛道,这条被誉为绿色地狱的20.6km赛道是让赛车在原始的山林之间高速穿梭,赛道随着山势而起伏,宛若云霄飞车。evo在这条赛道的最佳成绩是7分32秒52,而 AC-Schnitzer改装的BMW M3,最佳成绩是7分36秒。

在高速信息化的时代,我们对速度的渴望越发的强烈,Redis作为高速nosql内存db,以其出色的性能被大众认可,现在越来越多的互联网站点加入到了nosql行列。

测试内容:

对Redis的“test”key取值,然后返回这个值“test”。


 com  3000/30  3000/30 5000/30  5000/30  7000/30  7000/30 
 type  node php  node  php   node php 
 rps  5262  2015  5353  1949  5269  1901
 tpq  0.19  0.61  0.18  0.61  0.19  0.61
 80%req  671  1805  1210  2356  1650  3816
 fail  0  0  0  105  0  607


这个测试结果和memcache相差不大,因为redis和memcache相比他的优势不再key-value上,而是hash和sort,还有pub/sub等,所以在纯粹的key-value上,这次测试两者性能不相伯仲。

最终在纽博格林北环赛道,EVO(node)率先冲过了终点,成为本次对比的赢家。


尾声:

我想这次测试的结果应该早已经在各位的预料之中了,事件驱动对于内存消耗更少,非阻塞和连接池的加入让node对I/O操作更上一层楼。

虽然php在各方面都落于下风,但是并不代表php就不如node,php有他更适合的应用场景和广泛的开源框架以及技术支持。

node作为一种新型的服务器语言从被认可,到广泛用于生产环境要走的路还很长。


有图有真像:

巅峰对决:node.js和php性能测试 - snoopyxdy - snoopyxdy的博客


这个是在3000并发连发30秒测试的,如果1000并发连发30秒可以到8000+。

见下图:


巅峰对决:node.js和php性能测试 - snoopyxdy - snoopyxdy的博客