开发者社区> 墨航> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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。

只是简单测试一下。

测试Server用例

Node.js单进程


  1. var http = require('http');
  2. var server = http.createServer( (req, res) => {
  3. res.writeHead(200, {'Content-Type': 'text/plain'});
  4. res.end("Hello, World");
  5. });
  6. server.listen(8080);

Node.js Cluster(24)


  1. const cluster = require('cluster');
  2. const http = require('http');
  3. const numCPUs = require('os').cpus().length;
  4. if (cluster.isMaster) {
  5. for (var i = 0; i < numCPUs; i++) {
  6. cluster.fork();
  7. }
  8. cluster.on('exit', (worker, code, signal) => {
  9. console.log(`worker ${worker.process.pid} died`);
  10. });
  11. } else {
  12. http.createServer((req, res) => {
  13. res.writeHead(200);
  14. res.end("Hello, World");
  15. }).listen(8080);
  16. }

Python-Tornado


  1. import tornado.ioloop
  2. import tornado.web
  3. class MainHandler(tornado.web.RequestHandler):
  4. def get(self):
  5. self.write("Hello, world")
  6. def make_app():
  7. return tornado.web.Application([
  8. (r"/", MainHandler),
  9. ])
  10. if __name__ == "__main__":
  11. app = make_app()
  12. app.listen(8080)
  13. tornado.ioloop.IOLoop.current().start()

Go-Http


  1. package main
  2. import (
  3. "io"
  4. "net/http"
  5. )
  6. func main() {
  7. http.HandleFunc("/", sayhello)
  8. http.ListenAndServe(":8080", nil)
  9. }
  10. func sayhello(w http.ResponseWriter, r *http.Request) {
  11. io.WriteString(w, "hello world")
  12. }

OpenResty(Nginx+lua)


  1. worker_processes 1;
  2. error_log logs/error.log;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. server {
  8. listen 8080;
  9. location / {
  10. default_type text/html;
  11. content_by_lua '
  12. ngx.say("<p>hello, world</p>")
  13. ';
  14. }
  15. }
  16. }

结果

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

c = 1

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

c = 10

lang rps tpr (ms)
node 1x 3944.75 2.535
node 24x 5645.11 1.771
Py-Tornado 1318.85 7.582
Go-Http 70085.24 0.143
Nginx-lua 1x 24753.79 0.404
Nginx-lua 24x 24824.98 0.403

c = 100

lang rps tpr (ms)
node 1x 4042.27 24.739
node 24x 5816.23 17.193
Py-Tornado 1283.43 78.261
Go-Http 77451.38 1.373
Nginx-lua 1x 25001.29 4.080
Nginx-lua 24x 70333.04 1.619

结论:

  • OpenResty(Nginx+Lua) 与 Go语言属于性能第一梯队。Node属于第二梯队,Python垫底……。
  • Go是特么的禽兽啊……
  • OpenResty也不错……。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Node.js 性能平台新功能——模块仓库
Node.js 性能平台推出的模块仓库,在完全覆盖 cnpm 私有仓库功能的基础上,提供了一套多用户隔离 + 精确权限控制的模式,能够覆盖企业开发中面临的多种场景,最关键的是这一切功能目前是免费提供的。
13190 0
node.js模块依赖及版本号
摘要:   Node.js最重要的一个文件就是package.json,其中的配置参数决定了功能。例如下面就是一个例子 { "name": "test", "version": "1.
785 0
node.js模块的坑
在写一个工具的时候,需要将xml转为json方便处理,以前电脑上装的node.js的版本为0.8,结果我再安装node-xml2json时提示版本过低,然后我又重装安装了最新版本。 然后再次尝试安装,首先报python版本不对,不支持3.0,然后再降级,再然后说windows系统需要先安装node-expat,装这个模块又需要先装node-gyp,好吧然后我一直安装失败…   最后我使用了这个模块: node-xml2json   根据thomasfrank大师写的 XML to JSON 改造的,唯一要注意的是如果xml中的节点属性有大写,转换之后全部成小写了。
885 0
node.js使用mysql模块的坑
之前用node.js写的订餐系统,很容易挂掉,一直也没想去解决它。今天看了一下,试了试,原因是在连接数据库的时候没有对error事件进行处理,导致程序一直挂在那里,需要重启服务才能正常使用。   没有使用缓存,直接都是操作数据存,所以导致一个页面数据库请求比较多。
946 0
node.js的request模块
request模块让http请求变的更加简单。最简单的一个示例: 1: var request = require('request'); 2:  3: request('http://www.
671 0
+关注
26
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载