巅峰对决: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秒。

np1

说明:(下同)

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。

np2

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

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

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

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

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

测试内容:

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

np3

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

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

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

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

测试内容:

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

np4

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

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

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

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

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

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

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

测试内容:

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

np5

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

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

chapter4:决战纽博格林

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

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

测试内容:

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

np6

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

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

尾声:

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

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

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

有图有真像:

np7

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

见下图:

np8