首页 > 代码库 > 巅峰对决: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作为一种新型的服务器语言从被认可,到广泛用于生产环境要走的路还很长。
有图有真像:
这个是在3000并发连发30秒测试的,如果1000并发连发30秒可以到8000+。
见下图: