天天看点

Node.js, Go, Python, OpenResty Benchmark 结果

心血来潮,简单测试一下各种语言写的api server的性能。

我已经用过很多web框架了。python-httplib, python-flask,python-tornado,node-http, node-express,node-koa,node-restify, go-http。最近在做openapi,用了一个开源组件kong,后来觉得这玩意虽然设计的不错但是碍手碍脚,有一些功能还是需要深入底层去自己研究实现。后来发现kong是基于openresty实现的,而openresty则是nginx的一个“bundle”,打好了很多方便的包,性能很不错的样子。正好籍由此次机会,测试一下各语言写的裸api性能。

所有server端使用helloworld server,即发送”hello, world”字符串作为body。

测试client一并使用ab -kc10 -n50000进行。

测试环境server与client位于同一级房的两台相邻物理机。规格为: cpu: intel(r) xeon(r) cpu e5-2430 0 @ 2.20ghz 24核, 内存100g。

只是简单测试一下。

<code>var http = require('http');</code>

<code>var server = http.createserver( (req, res) =&gt; {</code>

<code>res.writehead(200, {'content-type': 'text/plain'});</code>

<code>res.end("hello, world");</code>

<code>});</code>

<code>server.listen(8080);</code>

<code>const cluster = require('cluster');</code>

<code>const http = require('http');</code>

<code>const numcpus = require('os').cpus().length;</code>

<code></code>

<code>if (cluster.ismaster) {</code>

<code>for (var i = 0; i &lt; numcpus; i++) {</code>

<code>cluster.fork();</code>

<code>}</code>

<code>cluster.on('exit', (worker, code, signal) =&gt; {</code>

<code>console.log(`worker ${worker.process.pid} died`);</code>

<code>} else {</code>

<code>http.createserver((req, res) =&gt; {</code>

<code>res.writehead(200);</code>

<code>}).listen(8080);</code>

<code>import tornado.ioloop</code>

<code>import tornado.web</code>

<code>class mainhandler(tornado.web.requesthandler):</code>

<code>def get(self):</code>

<code>self.write("hello, world")</code>

<code>def make_app():</code>

<code>return tornado.web.application([</code>

<code>(r"/", mainhandler),</code>

<code>])</code>

<code>if __name__ == "__main__":</code>

<code>app = make_app()</code>

<code>app.listen(8080)</code>

<code>tornado.ioloop.ioloop.current().start()</code>

<code>package main</code>

<code>import (</code>

<code>"io"</code>

<code>"net/http"</code>

<code>)</code>

<code>func main() {</code>

<code>http.handlefunc("/", sayhello)</code>

<code>http.listenandserve(":8080", nil)</code>

<code>func sayhello(w http.responsewriter, r *http.request) {</code>

<code>io.writestring(w, "hello world")</code>

<code>worker_processes 1;</code>

<code>error_log logs/error.log;</code>

<code>events {</code>

<code>worker_connections 1024;</code>

<code>http {</code>

<code>server {</code>

<code>listen 8080;</code>

<code>location / {</code>

<code>default_type text/html;</code>

<code>content_by_lua '</code>

<code>ngx.say("&lt;p&gt;hello, world&lt;/p&gt;")</code>

<code>';</code>

对各种语言框架的最简echoserver实现进行不同并发度的测试。结果如下:

lang

rps

tpr (ms)

node 1x

2451.25

0.408

node 24x

1119.81

0.893

py-tornado

1301.68

0.768

go-http

7108.64

0.141

nginx-lua 1x

7385.98

0.135

nginx-lua 24x

7368.34

0.136

3944.75

2.535

5645.11

1.771

1318.85

7.582

70085.24

0.143

24753.79

0.404

24824.98

0.403

4042.27

24.739

5816.23

17.193

1283.43

78.261

77451.38

1.373

25001.29

4.080

70333.04

1.619

结论:

openresty(nginx+lua) 与 go语言属于性能第一梯队。node属于第二梯队,python垫底……。

go是特么的禽兽啊……

openresty也不错……。