各语言框架并发性能测试

作者 : 开心源码 本文共1267个字,预计阅读时间需要4分钟 发布时间: 2022-05-13 共269人阅读

本文通过几个简单的实验,探索在 IO 等待为瓶颈的场景下,几个典型语言框架的并发能力。以论证异步框架在此场景下的优越性。

测试模型

假设这样一种场景,我们要搭建一个 api 转发服务器,即接到客户请求后,在服务器端调用第三方 api,等待 api 返回结果后,返回 response 给我们的客户。
本文探讨的就是当第三方 api 请求时间特别长(比方 20s)时的并发性能。如下图所示:

服务器配置

实验 web 服务器配置:1C 1G
并发请求用户端配置:2C 8G

测试结果

以 3000 并发为例,进行测试,结果如下:

开发语言框架运行方式并发请求数测试结果内存占用%最大 CPU%
nodejsexpress直接 run3000无报错9%25%
goiris直接 run3000无报错12%20%
pythonflask直接 run3000大量报错 系统卡死30%+70%+
pythonflaskgunicorn + gevent (1 个 worker)300030% 请求报错12%60%
pythondjango直接 run3000一律报错 系统卡死30%+80%+
pythondjangogunicorn + gevent (1 个 worker)300030% 请求报错18%65%
pythonsanic直接 run3000无报错13%35%

结论如下:

  • 在这种特殊测试场景(瓶颈在于 IO 等待)下,nodejs、go 这些语言的原生的异步框架的确性能出色
  • gunicorn + gevent 尽管可以通过打 patch 的方式实现异步协程,但效果还是始终原生的好
  • gunicorn + gevent 可以通过添加 worker 数量,提高并发能力(上例中假如将 worker 数添加到 3 后就不会报错了)
  • flask、django 直接 run,会创立一个框架默认的开发 server,它是以添加线程的方式来应对并发的,众所周知线程的切换成本比协程要高得多,由此例可以看出,当 server 维护 3000 个线程时就力不从心了
  • sanic 这类的异步框架,是 python 最后的牌面了(针对于这种特殊测试场景)

测试代码

代码仓库地址: taojy123/async_test
具体如下:

  • express server 代码 taojy123/async_test/blob/master/server1/app.js
  • iris server 代码 taojy123/async_test/blob/master/server2/main.go
  • flask server 代码 taojy123/async_test/blob/master/server3/run.py
  • django server 代码 taojy123/async_test/tree/master/server5
  • sanic server 代码 taojy123/async_test/blob/master/server4/run.py
  • 用户端并发请求代码 taojy123/async_test/blob/master/client.py
  • 推迟 20s 接口代码 taojy123/async_test/blob/master/serverx/app.js
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 各语言框架并发性能测试

发表回复