天天看點

實戰并發測試驗證gunicorn對flask的影響

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:[email protected]: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可以充分利用,性能高效

繼續閱讀