前言:
在github刷feeds的时候,发现不少老外关注了一个叫vibora的项目,该项目在github trending里的周star榜里也有不俗的成绩。 简单说,他是一个python的高性能又相当易用的一个web框架,名字叫 vibora。项目地址 https://github.com/vibora-io/vibora 。
我本身对这类所谓的高性能web框架也些不以为然,像先前出的sanic, Japronto,后来也没有啥大消息了,虽然他们的feature也一直在更新着。
每当一个新web框架出来的时候,貌似框架的作者都在wiki里上传他的benchmark,好多时候都怀疑他的测试方法和环境。我们看下vibora的benchamark成绩…. 感觉应该是用了高配机器和分布式压测。
该文章后续仍在不断的更新修改中, 请移步到原文地址 http://xiaorui.cc/?p=5350
考虑到vibora默认是多进程模式,这样对于大多数的web框架不公平的。当然,其他的框架是可以加gunicorn,uwsgi做server层实现多进程,但毕竟不是原生。现在我们不考虑这个,简单的测试 单进程 pk 单进程 模式。 因为在家连不上公司的主机,找了个阿里云4core、8g 的主机做了个压力测试。 大家都是在一个主机环境下测试,算是公平了。
无聊的压测
虽然这种hello world测试很无聊,毕竟一个web框架存在的意义不单单是压测,但通过该压测最少可以证明,web框架cython c化,性能确实有很大的提升。
vibora的server端代码. vibora需要python3.6.x的支持.
# xiaorui.cc from vibora import Vibora, Request from vibora.responses import JsonResponse app = Vibora() @app.route('/') async def home(request: Request): return JsonResponse({'hello': 'world'}) if __name__ == '__main__': app.run(host='0.0.0.0', port=2331, workers=1, debug=False)
WRK压测的结果, 我来回压了十来遍,基本qps都是在7.3w-8w之间的数值。
下面是top cpu的截图, 因为我们在vibora里配置了单个worker,自然就只是单核了。
试试 vibora 的多进程worker模式. 其实没测试之前,我就推断出会因为垃圾阿里云的软中断问题直接拉稀,果然…. 测试的结果跟我们预先的一样。 阿里云的ecs主机没办法调节rps、rfs软中断均衡的,他把配置文件的sys目录直接给你只读模式了,你怎么改?
后面我又无聊加蛋疼的对比了tornado、aiohttp、 sanic+uvloop、japronto 的web框架的性能。据我压测的结果来看, python2时代的tornado果然是让人失望,毕竟好几年前的tornado异步调度器是纯python构建的,而像aiohttp是依赖python3的asyncio,asyncio的部分代码是c扩展, aiohttp更是在2017年就引入了httptools的支持,所以aiohttp比tornado高看似理所当然的。sanic比aiohttp高的原因是,sanic可引入uvloop,uvloop core基本是cython构建,所以可以说 谁替换的C代码多,谁性能就高。 vibora的qps要领先他们所有人。原因看下面 !
注释: go net/http的压测在9w左右,go gin的压测在8w左右,可以说vibora的性能着实不差呀。
为什么vibora性能这么高?
针对python vibora性能高的这个问题,我还专门提了一个issue…. 作者的回复是说,vibora的高性能依赖于 cython实现的uvloop异步框架及cython实现的http_parser, 再加上一些cython构建的web组件,比如 模板,user-route等。还没有阅读vibora的源码,不知道里面具体的实现细节。
vibora logo
总结:
单单看vibora的性能已经很厉害了,web的使用也像极了flask框架。 作者也提供了一些例子,看起来还算丰富,就不知道能不能跑起来! 有兴趣的可以看看, https://github.com/vibora-io/vibora/tree/master/samples 。 期望vibora能越走越好,别赚取star后膨胀了,就不愿意commit了。