再次验证golang与node.js的http模块性能对比测试

以前看过性能对比测试的文章,是关于node.js和golang的http模块,简单的helloworld功能,原文在此: html

http://www.cnblogs.com/QLeelulu/archive/2012/08/12/2635261.html#2447171 node

再此文章以后,node.js和golang都升级了,node.js如今已经到了0.10,而golang也到了1.1版本,所以忽然想在前人的基础上再作一次性能测试。 python

具体代码仍然沿用引用文章里面的。 golang

硬件:双cpu,型号为xeon  E5620 2.40GHz,为4核cpu,由于支持超线程,因此系统显示逻辑cpu数为16个。 算法

软件环境:centos6.0 。 node.js版本为0.8.15,没有使用如今最新的0.10.13 . golang为最新的1.1。二者从版本新旧上来看并不对等,不过最后我会把node.js版本升级来对比。 apache

测试工具:apache ab,测试参数为并发1000,完成总数为200000次。 centos

node.js在1.2.4,8,16进程下每秒完成请求数为: 缓存

5980
11300
15495
20435
21029

而golang在设置对应的核心数支持下的数据以下: 性能优化

11109
16477
21874
21598
20527

图形显示以下: 服务器







从图中能够看到,在1,2,4核心支持的状况下,golang的指标都领先于node.js,并且领先幅度不小,在30%左右。可是到了8,16核的时候,golang就出现了性能没有提高或者小幅降低的现象,而node.js仍然为增势并最终反超。这种状况是很奇怪的,按理说,服务器双cpu,每颗4核心,加起来8个物理核心,若是说从8核心到16核只是cpu的超线程模拟出来的,不是真正的物理核心,那么从4核到8核,是真正的物理核心的增长,按理说性能应该继续增加的。经过top命令观察16个逻辑cpu的使用状况,发现golang在8核心和16核心的时候,16个逻辑cpu始终有3到6个负载很低,也就是golang没有彻底使用全部的cpu或者是负载比较不均衡。相比之下node.js在设置16个进程的时候,16个逻辑cpu都使用到了。看来golang自行调度cpu核心的算法仍是有问题,没有作到很好的负载,而node.js的多进程群集方案经过操做系统来平衡负载,效果更好。

不过node.js虽然在16个进程的时候全部的逻辑cpu都利用起来了,可是消耗基本在25%-45%之间,而golang在设置16个核心支持的时候,逻辑cpu负载最重也只有20%!平均只有15%左右。

回头回顾下前面说的node.js没用使用最新版原本对比的问题,我下载了最新的0.10.13版本,很奇怪的是,相比

0.8.15,每秒完成数反而出现了20%-30%的降低 ,这是什么状况,不知道其余人可碰到过这种问题。

另外,简单对tornado3 也作了测试,python的版本为2.6.5,由于python尚未真正的多核或者多线程支持,更不用说2.X版本,因此只作了一个线程的测试,数据为2200次/每秒 ,性能只有前二者的20%-30% .差距很大,

并且当并发数提高到2000的时候就出现了socket错误:apr_socket_recv: Connection reset by peer (104)

而node.js和golang在设置5000个并发下都很稳定。

固然,以上的测试并无涉及到操做系统参数的优化,测试代码也只是很是简单的helloworld,实际开发过程当中,有太多影响系统性能的因素,应用程序的代码须要调用不一样的类库,类库实现的优良与否以及使用的频度可能会对性能有很大影响,好比假设咱们的应用须要大量的磁盘i/o,这时候i/o库是否实现高效读写就对应用的性能有很大影响,抑或编码过程当中劣质的算法或者逻辑可能会带来性能巨大损耗,则会彻底抵消语言自己在性能优化上带来的提高,又好比从程序设计上合理使用缓存,可让应用的某些操做性能提升一个数量级等等。。

相关文章
相关标签/搜索