用Locust分别对Python 2.7 / 3.9 / 3.10上的CherryPy网站进行压力测试

创建:22-05-23 15:58    修改:22-05-23 16:00


我是 Python 及其 Web 框架 CherryPy 的粉丝。

最近,我将我的一个基于 CherryPy 的站点从 Python 2.7 / CherryPy 17.4.2 升级到了 Python 3.X / CherryPy 18.6.1。使用 2to3 工具,从 Python 2 到 Python 3 的代码迁移非常简单,我只需要手动更改一小部分代码。

升级后,我很好奇这次迁移是否会对性能产生任何影响,所以我使用 开源的 Locust 负载测试工具(太好用了!),在我的测试机器上进行压力测试(Surface Go 2 - Intel Core M3 8100Y (1.10GHz) 内存8GB ),这台机器同时运行我的 CherryPy 的 3 个实例测试站点:

  • 端口 84:Python 3.10 上的 CherryPy 18.6.1
  • 端口 83:Python 3.9 上的 CherryPy 18.6.1
  • 端口 81:Python 2.7 上的 CherryPy 17.4.2

检测结果有好多好消息!我很惊讶 Python 2.7 实例和 Python 3.9 实例之间的速度差异如此之大,而 Python 3.10 实例甚至更好一点!

显示图片

** 并发:150 个用户 **

  • 运行 #1 - 左:CherryPy 18.6.1 on Python 3.10 稳定后~94RPS,~68ms 响应时间,
  • 运行 #2 - Mid:CherryPy 18.6.1 on Python 3.9 稳定后~87RPS,~160ms 响应时间,
  • 运行 #3 - 右:CherryPy 17.4.2 on Python 2.7 稳定后~40RPS,~2.1s 响应时间,且一开始有很多 ConnectionRefusedErrors

值得一提的是,被测站点并不是一个“hello world”项目,它是一个真实的小型站点,从SQLite后端数据库中读取内容,并通过Jinja2模板引擎渲染页面,还使用了cookies和sessions,Locust 最后加载到的输出页面大小平均约为 30 Kb。此外,考虑到它在双核 Surface 上运行,我对这个性能已经非常满意了。

另外,为什么我仍然喜欢旧的 CherryPy 而不是更流行的微框架,如 Flask 和 FastAPI?因为据我所知,如果在生产中使用,Flask 或 FastAPI 需要另一个生产级的 WSGI HTTP Server,官方推荐的是 gunicorn,但它只在 UNIX 下可用,而我主要是 windows 用户...... CherryPy / Cheroot 可以也是这个 WSGI 服务器,但为什么我不应该使用cherrypy 作为一体化解决方案呢?



更多文章和博客...