フラスコとfastapiのパフォーマンステスト
背景
sy プロジェクトは、MQ を通じて業務システムから業務データを受け取り、開発者が開発した Python スクリプトを実行することで業務システムと金融システムのデータの整合性検証を行います。
sy システムは毎日大量の Python スクリプトを実行する必要があります。Falsk は現在、Python スクリプトを 1 日に 6 回以上実行するために使用されていますが、パフォーマンスのボトルネックのため、
CPU とメモリのパフォーマンス不足と現在のパフォーマンスのボトルネックの問題を解決するには、新しい fastapi フレームワークを導入する必要があります。この記事の目的は、両方のパフォーマンス テスト レポートを提供することです。
どのフレームワークを選択するかをサポートするパフォーマンス データを提供します。
Apache ab の概要
Apache ab パフォーマンステスト
インストール
yum -y install httpd-tools
パラメータの一部の説明
-n 执行的请求总数
-c 并发数, 同时执行的数量, c不能大于n
-p post请求指定的文件
-T header Content-type值,默认为 'text/plain'
テスト取得リクエスト
ab -c 10 http://127.0.0.1:8081/cppla
テスト投稿リクエスト
ab -n 100 -c 10 -T 'application/json' -p httpjson.txt http://127.0.0.1:8081/cppla1
// httpjson.txt的内容
{
"recordId": 123}
テスト計画
各リクエストの実際のスクリプト呼び出しをシミュレートし、各桁のリクエスト量をテストします。
リクエストの合計 | 毎回の同時実行数 | 毎回の同時実行数 | 毎回の同時実行数 |
---|---|---|---|
100 | 10 | 100 | 1000 |
1000 | 10 | 100 | 1000 |
10000 | 10 | 100 | 1000 |
20000 | 10 | 100 | 1000 |
30000 | 10 | 100 | 1000 |
40000 | 10 | 100 | 1000 |
50000 | 10 | 100 | 1000 |
60000 | 10 | 100 | 1000 |
80000 | 10 | 100 | 1000 |
テストコード
post リクエストを処理し、3 秒遅れて結果を返します。フラスコは 20 のプロセスを開始します。fastapi がプロセスを開始します。
## flask 代码
# coding: utf-8
from gevent import monkey
from gevent.pywsgi import WSGIServer
import requests
import datetime
import os
from multiprocessing import cpu_count, Process
from flask import Flask, jsonify,request
import json
import traceback
import importlib
from loguru import logger
import time
app = Flask(__name__)
# 执行run方法
@app.route("/cppla1", methods=['POST', 'GET'])
def cppla1():
data = request.json
time.sleep(3)
return data
# 启动监听ip、端口
def run(MULTI_PROCESS):
if MULTI_PROCESS == False:
WSGIServer(('0.0.0.0', 8081), app).serve_forever()
else:
mulserver = WSGIServer(('0.0.0.0', 8081), app)
mulserver.start()
def server_forever():
mulserver.start_accepting()
mulserver._stop_event.wait()
# for i in range(cpu_count()):
for i in range(20):
logger.info('启动进程第几个:{}', i)
p = Process(target=server_forever)
p.start()
if __name__ == "__main__":
# 单进程 + 协程
# run(False)
# 多进程 + 协程
log_init()
run(True)
## fastapi
# coding: utf-8
# https://www.javazhiyin.com/80750.html
# import web framework
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
# import base lib
import datetime
import os
import requests
import json
import traceback
import importlib
from loguru import logger
import time
app = FastAPI()
@app.post("/cppla1")
def function_benchmark(data:dict):
time.sleep(3)
return {
"item": data}
# 启动监听ip、端口
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8081)
試験結果
フレームタイプ | リクエストの合計 | 毎回の同時実行数 | かかった時間 | 毎回の同時実行数 | かかった時間 | 毎回の同時実行数 | かかった時間 |
---|---|---|---|---|---|---|---|
ファスタピ | 100 | 10 | 33.119 | 100 | 12.148 | 1000 | ab コマンドはサポートされていません |
フラスコ | 100 | 10 | 45.088 | 100 | 81.106 | 1000 | ab コマンドはサポートされていません |
ファスタピ | 1000 | 10 | 304.057 | 100 | 78.283 | 1000 | 78.631 |
フラスコ | 1000 | 10 | 327.472 | 100 | 198.273 | 1000 | 303.442 |
ファスタピ | 10000 | 10 | バツ | 100 | 754.296 | 1000 | 757.719 |
フラスコ | 10000 | 10 | バツ | 100 | 1550.119 | 1000 | 1970.427 |
ファスタピ | 20000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 20000 | 10 | バツ | 100 | バツ | 1000 | バツ |
ファスタピ | 30000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 30000 | 10 | バツ | 100 | バツ | 1000 | バツ |
ファスタピ | 40000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 40000 | 10 | バツ | 100 | バツ | 1000 | バツ |
ファスタピ | 50000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 50000 | 10 | バツ | 100 | バツ | 1000 | バツ |
ファスタピ | 60000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 60000 | 10 | バツ | 100 | バツ | 1000 | バツ |
ファスタピ | 80000 | 10 | バツ | 100 | バツ | 1000 | バツ |
フラスコ | 80000 | 10 | バツ | 100 | バツ | 1000 | バツ |
結論は
Fastapi は flask の 3 倍のパフォーマンスを備えているため、fastap の使用を推奨します。