心血来潮,简单测试一下各种语言写的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) => {</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 < numcpus; i++) {</code>
<code>cluster.fork();</code>
<code>}</code>
<code>cluster.on('exit', (worker, code, signal) => {</code>
<code>console.log(`worker ${worker.process.pid} died`);</code>
<code>} else {</code>
<code>http.createserver((req, res) => {</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("<p>hello, world</p>")</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也不错……。