且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2021-09-16 01:26:10

Python代码

p.py

from flask import Flask, jsonify

from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePool

app = 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)


def to_json(item):
    return {
        "id": item[0],
        "username": item[1],
        "email": item[2]
    }


@app.route("/", methods=["get"])
def index():
    data = {"msg": "", "data": []}
    with engine.connect() as connect:
        result = connect.execute("select id,username,email from user")
        for item in result.all():
            data["data"].append(to_json(item))
        return jsonify(data), 200


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7002)

NGINX配置

upstream backend {
    server 172.16.5.9:7002;
}
server {
    listen 17002;
    location / {
      proxy_pass http://backend;
    }
}


架构图

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

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



运行程序

[root@izbp152ke14timzud0du15z pool]# python3 p.py
 * Serving Flask app 'p' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.16.5.9:7002/ (Press CTRL+C to quit)


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

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


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

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



通过gunicorn来运行flask应用

[root@izbp152ke14timzud0du15z pool]# gunicorn -w 8 -b 172.16.5.9:7002 p:app
[2021-11-06 20:14:21 +0800] [19426] [INFO] Starting gunicorn 20.1.0
[2021-11-06 20:14:21 +0800] [19426] [INFO] Listening at: http://172.16.5.9:7002 (19426)
[2021-11-06 20:14:21 +0800] [19426] [INFO] Using worker: sync
[2021-11-06 20:14:21 +0800] [19429] [INFO] Booting worker with pid: 19429
[2021-11-06 20:14:21 +0800] [19449] [INFO] Booting worker with pid: 19449
[2021-11-06 20:14:21 +0800] [19486] [INFO] Booting worker with pid: 19486
[2021-11-06 20:14:21 +0800] [19504] [INFO] Booting worker with pid: 19504
[2021-11-06 20:14:21 +0800] [19507] [INFO] Booting worker with pid: 19507
[2021-11-06 20:14:21 +0800] [19508] [INFO] Booting worker with pid: 19508
[2021-11-06 20:14:21 +0800] [19509] [INFO] Booting worker with pid: 19509
[2021-11-06 20:14:21 +0800] [19511] [INFO] Booting worker with pid: 19511

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

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

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

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


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

结论:

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

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