实战并发测试验证gunicorn对flask的影响

简介: 实战一把gunicorn到底能不能提升性能

Python代码

p.py

fromflaskimportFlask, jsonifyfromsqlalchemyimportcreate_enginefromsqlalchemy.poolimportQueuePoolapp=Flask(__name__)
engine=create_engine(url="mysql+pymysql://root:123456@172.16.5.9:3306/demo?charset=utf8",
pool_size=20,
pool_recycle=3600*7,
poolclass=QueuePool,
echo=False)
defto_json(item):
return {
"id": item[0],
"username": item[1],
"email": item[2]
    }
@app.route("/", methods=["get"])
defindex():
data= {"msg": "", "data": []}
withengine.connect() asconnect:
result=connect.execute("select id,username,email from user")
foriteminresult.all():
data["data"].append(to_json(item))
returnjsonify(data), 200if__name__=="__main__":
app.run(host="0.0.0.0", port=7002)

NGINX配置

upstreambackend {
server 172.16.5.9:7002;
}
server {
listen 17002;
location / {
proxy_passhttp://backend;
    }
}


架构图

flask直接运行,gunicon运行flask,两者是只有一个在运行,不是同时运行



运行程序

[root@izbp152ke14timzud0du15zpool]# python3 p.py*ServingFlaskapp'p' (lazyloading)
*Environment: productionWARNING: Thisisadevelopmentserver. Donotuseitinaproductiondeployment.
UseaproductionWSGIserverinstead.
*Debugmode: off*Runningonalladdresses.
WARNING: Thisisadevelopmentserver. Donotuseitinaproductiondeployment.
*Runningonhttp://172.16.5.9:7002/ (PressCTRL+Ctoquit)


服务端负载,CPU为4核的,资源使用率5分之1吧


样本60万请求数,tps为492/sec,p90为1303ms



通过gunicorn来运行flask应用

[root@izbp152ke14timzud0du15zpool]# gunicorn -w 8 -b 172.16.5.9:7002 p:app[2021-11-0620:14:21+0800] [19426] [INFO] Startinggunicorn20.1.0[2021-11-0620:14:21+0800] [19426] [INFO] Listeningat: http://172.16.5.9:7002 (19426)
[2021-11-0620:14:21+0800] [19426] [INFO] Usingworker: sync[2021-11-0620:14:21+0800] [19429] [INFO] Bootingworkerwithpid: 19429[2021-11-0620:14:21+0800] [19449] [INFO] Bootingworkerwithpid: 19449[2021-11-0620:14:21+0800] [19486] [INFO] Bootingworkerwithpid: 19486[2021-11-0620:14:21+0800] [19504] [INFO] Bootingworkerwithpid: 19504[2021-11-0620:14:21+0800] [19507] [INFO] Bootingworkerwithpid: 19507[2021-11-0620:14:21+0800] [19508] [INFO] Bootingworkerwithpid: 19508[2021-11-0620:14:21+0800] [19509] [INFO] Bootingworkerwithpid: 19509[2021-11-0620:14:21+0800] [19511] [INFO] Bootingworkerwithpid: 19511

服务端负载,基本上已经满负载了

样本60万请求数,tps为1939/sec,p99为1114ms


在4核CPU的情况下,同环境,不同方式运行应用,tps吞吐量提示将近4倍

结论:

   通过直接运行flask,多核CPU无法充分利用资源,性能低下

   通过gunicorn运行flask,多核CPU可以充分利用,性能高效

目录
打赏
0
0
0
1
4
分享
相关文章
软件测试的艺术:确保质量的实战策略
在软件开发的舞台上,测试是那把确保每个功能如交响乐般和谐奏响的指挥棒。本文将深入探讨软件测试的重要性、基本类型以及如何设计高效的测试策略。我们将通过一个实际的代码示例,展示如何运用这些策略来提升软件质量和用户体验。
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
犬类癌症检测(CANDiD)研究:使用独立测试集对1000多只犬进行基于高通量测序的多癌种早期检测"液体活检"血液测试的临床验证
这项研究首次在大规模独立测试集上验证了基于NGS的液体活检在犬类多癌种检测中的应用。该方法具有很高的特异性,可以作为一种新的无创癌症筛查和辅助诊断工具。通过早期发现癌症,有望改善犬类癌症的诊断和管理模式。
73 12
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
93 3
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
5662 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
989 1
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
99 1
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
141 2
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
83 2
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
761 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)

热门文章

最新文章