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,兩者是隻有一個在運作,不是同時運作

運作程式
[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吧
樣本60萬請求數,tps為492/sec,p90為1303ms
通過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
服務端負載,基本上已經滿負載了
樣本60萬請求數,tps為1939/sec,p99為1114ms
在4核CPU的情況下,同環境,不同方式運作應用,tps吞吐量提示将近4倍
結論:
通過直接運作flask,多核CPU無法充分利用資源,性能低下
通過gunicorn運作flask,多核CPU可以充分利用,性能高效