× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Nginx/Golang/Swoole/Node.js的性能对比

通过ab工具分别压测nginx swoole node.js golang的http server,并观察结果。 web server都是输出一行It work! 硬件环境是一台8G/4核酷睿I5CPU的笔记本电脑,型号是Thinkpad T430.

Nginx   ab -c 100 -n 100000 http://localhost/index.html
Swoole  ab -c 100 -n 100000 http://127.0.0.1:8848/
Node.js ab -c 100 -n 100000 http://127.0.0.1:8080/
Golang  ab -c 100 -n 100000 http://127.0.0.1:8080/

本次测试使用的软件版本如下:

nginx version: nginx/1.2.6 (Ubuntu)
go version go1.1.1 linux/amd64
swoole-1.5.4
node.js-0.11.3-pre

代码在./code目录中。

QPS对比

Nginx:      Requests per second:    23770.74 [#/sec] (mean)
Golang:     Requests per second:    21807.00 [#/sec] (mean)
Swoole:     Requests per second:    19711.22 [#/sec] (mean)
Node.js:    Requests per second:    6680.53 [#/sec] (mean)

内存占用对比

Golang 运行多次压测后内存从2920K上升至5580K,再继续压测不会上升

Node.js运行多次后内存一直在涨,怀疑有轻微内存泄露。从开始运行的5930K,到最后的6060K。

Nginx的4个worker进程,内存占用一直稳定在820K。

Swoole的主进程内存占用一直稳定在3200K,多次压测内存占用没有任何增加。Worker进程的内存有小幅增加。

通过设置Swoole的max_request参数,worker进程的生命周期是可以控制的,生命周期结束后会自动回收所有内存,所以轻微的内存泄露问题也不大。

测试时间为2013年,最新版本已解决内存泄漏问题

TCP长连接的维持能力

Nginx、Golang、Swoole、node.js都是使用epoll/kqueue作为事件轮询机制的。维持多少长连接与程序代码本身没有任何关系,取决于操作系统的内存大小。

结果评价

Nginx、Golang、Swoole都是多线程Reactor的,可以充分利用多核,所以成绩是node.js的数倍。 Swoole中的PHP代码需要编译为opcode来执行,每条opcode都是一次函数调用。语言的执行效率效率比C语言(Nginx),Golang这种编译型的语言差一些。 Node.js的http模块不是多线程的,无法利用多核,结果最差。这里并不是说node.js的性能差,使用第三方的node扩展cluster也可以使node.js变成多进程。

在最新的swoole-1.7.6+版本中,基准压力测试swoole无论是短连接还是长连接,均已超过了Golang。在下一个版本发布后,将会重新发布性能测试报告。


  • JT

    4核CPU,Node.js起4个进程。6680.53 * 4再打个8折。约等于21377.696。

  • 程序猿始终不够

    pthreads扩展有内存泄露的BUG,swoole多线程基于这个扩展,不知道这个扩展的内存泄露问题是否已经恢复

  • Rango-韩天峰

    Node.js开不了啊。就算可以,最多提升3倍吧。

  • Rango-韩天峰

    Swoole跟pthreads扩展没有任何关系。

  • jt

    cluster是node官方的模块,不是三方

  • 麻雀在庭院嘻闹盛开的乔治亚

    前几天我在看node js 和PHP Python的对比,感觉PHP要废了,还好有swoole,就是swoole比node性能差20%都无所谓,nodejs的无限回调会弄哭程序员的,至少我在前端开发的时候觉得回调很烦躁

  • 詹潮江

    异步的都是要回调的,php也一样...

  • svpg

    最后一句有点傻, 异步编程本身就要回调, Promise的出现就是为了解决这个问题的

  • 郝多

    这个测试是go1.1版本的,go现在1.6了,请问测试者配置GOMAXPROCS环境变量了吗?这个变量影响go的并发线程数量。 我做的go1.6测试,性能高过swoole 1.8.5。只是默认配置GOMAXPROCS。