天天看點

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也不錯……。