
作者:沙鱼
链接:https://www.zhihu.com/question/29453255/answer/230380683
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
今天刚好做了个压测各类传说中高性能的框架,使用的语言也很多,来回答下这个问题。
起因:
公司有需求开发一个高性能的服务器,每秒并发至少5K,boss是python的粉丝,所以选择了python
于是选型方面选择了tornado。
压测参数为并发数8000 总请求数1000000 计算60s内的每秒请求数和返回时间
注:最新补发的数据压测参数并发数为800,总请求数1000W计算60s内请求数和返回时间
因为在原有并发数8000的情况下 netty,node,tornado的错误率感人,所以其实并没有意义
tornado开发完成后压测只能达到2K6的并发,平均返回值在4600ms,有点失望,遂重构。
期间同事一直在安利他写的一个Go版本服务端 压测并发轻松达到2W并且返回时间在600ms以内
于是用Go重写了服务端,部署后轻松满足并发压力,这是前序。
部署完成后手上有点空闲,于是想做一个横向对比看看各高性能语言和框架到底压测表现怎么样。
所有服务只输出一个简单的hello,所选对比语言和框架为
php swoole 版本7.1 开启opcache
nodejs 版本1.4 apt-get直接安装
tornado 版本4.51 python3.5
go http包 版本1.6
java netty 新数据已经补上,版本4.1.5.final
因为本身是虚拟机,性能肯定比正式服务器是要低很多的
压测结果QPS(带代码) :
-----------------------------2017.9.30最新数据-------------------------------------
所有测试均按如下格式
语言框架 长连接-----短连接 平均处理时间(长连接----短连接) CPU使用率
Swoole 17356 ---- 57521 58ms ---- 13ms 110% - 120%
<?php $http = new swoole_http_server("127.0.0.1", 10086); $http->on('request', function ($request, $response) { $response->end("Hello");}); $http->start(); ?>
go 19414 ---- 55824 40ms ---- 14ms 110% - 120%
package main;import ( "net/http")func hello(w http.ResponseWriter, req *http.Request) { w.Write([]byte("Hello"))}func main() { http.HandleFunc("/", hello); http.ListenAndServe(":10086", nil);}
nodejs 12297 ---- 22381 81ms ---- 35ms 100%
const http = require('http');// Create an HTTP tunneling proxyhttp.createServer((req, res) => { res.end('hello');}).listen(10086, '127.0.0.1');
tornado 1600 ---- 2057 388ms 100%
import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello")def make_app(): return tornado.web.Application([ (r"/", MainHandler), ])if __name__ == "__main__": app = make_app() app.listen(10086) tornado.ioloop.IOLoop.current().start()
Netty 4000 ---- 46032 200ms ---- 17.3ms 110% - 120%
Netty的http封装使用github上的一个简易框架 这框架有几个import 的bug...
参数为java -server -Xmx8096m
looly/loServer
package com.xiaoleilu.loServer.main; import com.xiaoleilu.loServer.LoServer; import com.xiaoleilu.loServer.handler.Request; import com.xiaoleilu.loServer.handler.Response; import com.xiaoleilu.loServer.ServerSetting; import com.xiaoleilu.loServer.action.Action; public class MainAction implements Action{ @Override public void doAction(Request request, Response response) { //String a = request.getParam("a"); response.setStatus(200); response.setContent("hello"); } public static void main(String[] args) { ServerSetting.setAction("/main", MainAction.class); ServerSetting.setPort(8090); LoServer.start(); }}
注:从上面的数据可以看出Netty这个框架的长短连接处理能力简直是一个天上一个地下。那些吹tornado框架性能的可以歇歇了,比原生php是好了几倍(原生的QPS只能到400左右,不谈也罢),但跟node,swoole,go比起来差距太大,处理时间也没法忍受
cpu使用率node和tornado都稳定在100左右,其它都在100到120上下波动,swoole的资源释放很出色,有需要解决性能问题选用框架的可以参考以上数据。
说实话 很惊讶,php能达到这个性能,我做过上面所有语言的开发,所以才选了这几个比较熟悉的语言做压测。
php是天生的为web而生的语言,这种对比在你用其它语言做web开发的时候感受尤其深刻,怎么说呢,跟javascript差不多,就是自由,只管去实现你的逻辑。
在开发便利性和开发效率方面php跟js和go、java之类的语言比起来大概可以称之为爽,这个写过多种语言的应该深有体会,就不深入了。
所以结论是这个框架很有前途,php的简便性加上这个性能,应该会有一些大团队采用这个框架。要说性能 肯定是C,但是用C开发web,那不是各种痛苦,nodejs能迅速发展,就是依托于javascript这个语言的简便和入门的容易,那么swoole这个框架,显然也很有市场,不过提个建议
深入的文档可以再丰富些,另外windows版本没有.dll的文件,这对很多php开发者来说,其实很不方便,不利于推广。
nodejs就不存在这方面的问题,所以迅速壮大也在情理之中
结论:swoole其实就是一个披着php外衣的C程序 对php开发者来说,不妨一试。
另外推荐一个框架mixstart/mixphp 设计得很优秀开发使用普通php方式 部署使用swoole 大大降低了swoole的使用难度