nginx + tornado vs golang gin 并发性能比较
黄太龙
之前回答过一个web框架性能比较的帖子,里面提到了github上有各类web框架的性能比较的结果。
但是,我今天重新思考了这个问题,所以开了目前这个帖子;我特地以 nginx + tornado vs golang的gin为例。
我先贴出一个别人的测试结果,是tornado多进程 vs golang的gin框架。
tornado是不采用异步的时候,其实是单进程阻塞的。有时1个tornado都未必能把cpu用满,别说用满,有时25%都用不到。
gin是基于Golang的异步框架,天生就是异步的。
机器配置24核,使用apache benchmark测试;网友的结果如下
Tornado单进程,并发4: Req/Sec:971.4 MSec/Req:4.1 CPU:100% Tornado单进程,并发20: Req/Sec:1159.2 MSec/Req:17.2 CPU:100% Tornado多进程(24),并发20: Req/Sec:=5284.7 MSec/Req:3.8 CPU:1200% Tornado多进程(24),并发100: Req/Sec:=15015.2 MSec/Req:6.6 CPU:2300% Tornado多进程(24),并发200: Req/Sec:=15264.26 MSec/Req:13.1 CPU:2300% Gin多协程,并发20: Req/Sec:=10723.2 MSec/Req:1.9 CPU:400% Gin多协程,并发100: Req/Sec:=16342.8 MSec/Req:6.1 CPU:1700% Gin多协程,并发200: Req/Sec:=16153.9 MSec/Req:12.4 CPU:1700%
主要对比一下:
Tornado多进程(24),并发200: Req/Sec:=15264.26 MSec/Req:13.1 CPU:2300% Gin多协程,并发200: Req/Sec:=16153.9 MSec/Req:12.4 CPU:1700%
所以,可以看出,tornado多进程模式下,其实威力也是蛮大的,并非是之前那个测试结果中的gin是tornado的并发能力的9倍。所以,我的观点:
类似我上次发帖中的那个benchmark的一系列测试结果是不科学与不合理的。参考价值有限。
用单进程去比较没有实战意义。实际中,我肯定会在负载均衡后采用多进程啊。所以忽略占用的系统资源去比较web框架,这就是耍流氓。
根据上述结果,可见达到同等并发水平,Gin占用了17个CPU,24个tornado进程,占用了23个CPU资源。
所以,Gin还没有到达限制。所以,Gin真正比tornado强的倍数应该是 23/17,大概在1.4倍左右,并非是9倍。(特指普通场景)
比较web框架不应把不可单进程无法充分利用系统资源的框架与能充分多核系统资源的框架进行直接比较,直接比较出的天价悬殊,会让开发者忽略开发效率的关注。
同理,拿tornado多进程和nodejs比较,tornado多进程应该是优于nodejs的express框架的;而且,如果为了加速计算,可以不用传统的python解释器,而是用pypy来加速。
所以,特此开了这个帖子,呼吁理性比较web框架。选择最合适的即可。
论性能、论并发、论资源利用,部分场景下,gin比tornado的强绝不止上述测算出的1.4倍;golang的并发做的很好,这点不是python的异步协程能达到的水准,如果是处理一个并发任务(备注不是并发请求模拟,而是单个请求中进行并发任务)那么tornado就会受制于python的处理并发任务的能力而被golang狂虐。
进一步补充,其实我上述说的gin是tornado多进程的1.4倍性能,其实并不严谨,只能是特定情况下,以及还要考虑一次请求的完成时间等因素,所以,不是一个准确的倍数能描述的,但gin比tornado强 这是肯定的。我估计整体来说是gin是tornado多进程和nodejs的2-3倍;tornado多进程和nodejs是一个水准的。