フラスコとfastapiのパフォーマンステスト

フラスコと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 の使用を推奨します。

おすすめ

転載: blog.csdn.net/u013565163/article/details/128048213