单服务器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秒测试的7900+,如果1000并发连发30秒可以到8500+。
图片地址在我的博客,拉到最底部:
展开阅读全文

没有更多推荐了,返回首页