meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能對比測試

本文會使用如下兩個項目:meinheld-gunicorn-flask 與 uvicorn-gunicorn-fastapi

前文有測過 Flask vs FastApi 性能對比測試,可能不夠有說服力,這次使用了號稱最快的wsgi或asgi服務器+gunicorn來運行flask或fastapi。

上面meinheld-gunicorn-flask和uvicorn-gunicorn-fastapi項目都是由fastapi的作者發起,致力于使用flask或fastapi開發高性能后端應用,然后用docker的方式快速部署。文末會給出測試結論。

名詞解釋

meinheld:高性能wsgi服務器
uvicorn:高性能asgi服務器
gunicorn:用來管理meinheld或uvicorn的運行,比如用多進程/多線程的方式運行meinheld或uvicorn,以便最大化性能來運行flask或fastapi程序。

測試環境

Ubuntu 22.04系統,CPU 16核,內存32G。

一、創建 meinheld-gunicorn-flask-test 目錄,目錄結構為
meinheld-gunicorn-flask-test
├── Dockerfile
├── app
│   ├── main.py
│   └── prestart.sh  # 可以不要這個文件
└── requirements.txt

Dockerfile內容:

FROM tiangolo/meinheld-gunicorn-flask:python3.9COPY ./requirements.txt /app/requirements.txtRUN pip install --no-cache-dir --upgrade -r /app/requirements.txtCOPY ./app /app

requirements.txt 內容

blinker==1.8.2
click==8.1.7
Flask==3.0.3
importlib_metadata==7.1.0
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
Werkzeug==3.0.3
zipp==3.18.2

app/main.py 內容

from flask import Flaskapp = Flask(__name__)@app.route('/', methods=['GET'])
def root():return {"Hello": "Flask"}

構建docker鏡像:

cd meinheld-gunicorn-flask-test/
docker build -t meinheld-gunicorn-flask-test:1.0.0 .

運行docker容器:

docker run -d --name meinheld-gunicorn-flask-test -p 8080:80 meinheld-gunicorn-flask-test:1.0.0
二、創建 uvicorn-gunicorn-fastapi-test 目錄,目錄結構為:
uvicorn-gunicorn-fastapi-test
├── Dockerfile
├── app
│   ├── main.py
│   └── prestart.sh  # 可以不要這個文件
└── requirements.txt

Dockerfile內容:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.10COPY ./requirements.txt /app/requirements.txtRUN pip install --no-cache-dir --upgrade -r /app/requirements.txtCOPY ./app /app

requirements.txt 內容

annotated-types==0.7.0
anyio==4.3.0
certifi==2024.2.2
click==8.1.7
dnspython==2.6.1
email_validator==2.1.1
exceptiongroup==1.2.1
fastapi==0.111.0
fastapi-cli==0.0.4
h11==0.14.0
httpcore==1.0.5
httptools==0.6.1
httpx==0.27.0
idna==3.7
Jinja2==3.1.4
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
orjson==3.10.3
pydantic==2.7.1
pydantic_core==2.18.2
Pygments==2.18.0
python-dotenv==1.0.1
python-multipart==0.0.9
PyYAML==6.0.1
rich==13.7.1
shellingham==1.5.4
sniffio==1.3.1
starlette==0.37.2
typer==0.12.3
typing_extensions==4.12.0
ujson==5.10.0
uvicorn==0.29.0
uvloop==0.19.0
watchfiles==0.21.0
websockets==12.0

app/main.py 內容

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"Hello": "FastA"}

構建docker鏡像:

cd uvicorn-gunicorn-fastapi-test/
docker build -t uvicorn-gunicorn-fastapi-test:1.0.0 .

運行docker容器:

docker run -d --name uvicorn-gunicorn-fastapi-test -p 8081:80 uvicorn-gunicorn-fastapi-test:1.0.0

性能測試

這里使用ab工具測試并發。先把最大打開文件數調大,執行命令:ulimit -n 65535

# 測試flask,并發3000,連接數10萬
ab -n 100000 -c 3000 http://127.0.0.1:8080/Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requestsServer Software:        meinheld/1.0.2
Server Hostname:        127.0.0.1
Server Port:            8080Document Path:          /
Document Length:        18 bytesConcurrency Level:      3000
Time taken for tests:   7.209 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      16900000 bytes
HTML transferred:       1800000 bytes
Requests per second:    13871.03 [#/sec] (mean)
Time per request:       216.278 [ms] (mean)
Time per request:       0.072 [ms] (mean, across all concurrent requests)
Transfer rate:          2289.26 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   99  12.5     99     148
Processing:    36  113  20.7    110     346
Waiting:        1   82  18.0     80     317
Total:        109  213  18.1    208     430Percentage of the requests served within a certain time (ms)50%    20866%    21275%    21880%    22590%    23495%    24298%    25299%    258100%    430 (longest request)

下面是fastapi:

# 測試fastapi,并發3000,連接數10萬
ab -n 100000 -c 3000 http://127.0.0.1:8081/Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requestsServer Software:        uvicorn
Server Hostname:        127.0.0.1
Server Port:            8081Document Path:          /
Document Length:        17 bytesConcurrency Level:      3000
Time taken for tests:   7.198 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      14200000 bytes
HTML transferred:       1700000 bytes
Requests per second:    13892.29 [#/sec] (mean)
Time per request:       215.947 [ms] (mean)
Time per request:       0.072 [ms] (mean, across all concurrent requests)
Transfer rate:          1926.47 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   88  10.2     88     138
Processing:    44  124  25.8    121     223
Waiting:        1   94  27.8     82     200
Total:         99  213  24.7    208     324Percentage of the requests served within a certain time (ms)50%    20866%    22375%    22980%    23290%    24295%    25698%    27999%    287100%    324 (longest request)
結論:

fastapi(13892.29) 和 flask(13892.29)并發量幾乎一樣,看來 meinheld 的性能確實很高。甚至在 ab 參數 -n 100000 -c 1000 的情況下,多次測試后,fastapi和flask并發數各有勝負。

因此在開發簡單快速的項目時,可以用 meinheld-gunicorn-flask 這套方案。而在需要更多異步編程,需要類型檢查,或者docs(Swagger)文檔時,可以用 uvicorn-gunicorn-fastapi 這套方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15793.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫-SQL性能分析

SQL執行頻率 慢查詢日志 慢查詢日志記錄了所有執行時間超過指定參數(long_query_time,單位:秒,默認10秒)的所有 SQL語句的日志。 MySQL的慢查詢日志默認沒有開啟,我們可以查看一下系統變量 slow_query_l…

html5 筆記02

目錄 01 svg的基本使用 02 svg繪圖 03 進程和線程 01 svg的基本使用 svg和canvas的區別: canvas: 1.canvas作為一個容器只有一個dom元素 ,內部元素無法使用dom操作 (canvas不能展開然后選擇不到 svg查看元素能選中因為是通過標簽控制的) 2.canvas 是配合js完成各種繪制效果 …

vue-route的路由配置中父組件沒有component怎么處理

概述 為了方便開發和維護,所以web前端的路由配置路徑和前端代碼文件路徑一般是一致的。但在實際開發中,項目可能會分很多級的菜單,由于很多菜單只有葉子菜單是真正的頁面。而中間菜單項只是一個路由配置。 為了正確路由到底層的功能頁面&…

指紋識別概念解析

目錄 1. 指紋是物證之首 1.1 起源于中國 1.2 發展于歐洲 1.3 流行于全世界 2. 指紋圖像 3. 指紋特征 4. 指紋注冊 5. 指紋驗證 6. 指紋辨識 1. 指紋是物證之首 指紋識別技術起源于中國、發展于歐洲、流行于全世界。自20世紀以來,指紋在偵破刑事案件、解決訴…

水泥超低排平臺哪家好?

隨著環保政策的加強和綠色發展理念的深入人心,水泥行業的超低排放改造已成為行業發展的新趨勢。選擇一個合適的水泥超低排平臺對于確保改造效果和實現企業的可持續發展至關重要。朗觀視覺小編將從多個角度出發,為您提供一份綜合評估與選擇攻略&#xff0…

Spring Boot 3.x 與 Spring Boot 2.x 的對比

Spring Boot 是 Java 開發領域的一個重要框架,它簡化了基于 Spring 的應用開發。隨著版本的不斷更新,Spring Boot 提供了更多功能、更好的性能以及更簡潔的配置。本文將詳細對比 Spring Boot 3.x 和 Spring Boot 2.x,探討它們之間的主要區別和…

[C語言]自定義類型詳解:結構體、聯合體、枚舉

目錄 🚀結構體 🔥結構體類型的聲明 🔥結構的自引用 🔥結構體變量的定義和初始化 🔥結構體內存對齊 🔥結構體傳參 🔥結構體實現位段(位段的填充&可移植性) &a…

安裝 Ubuntu桌面版,詳細步驟(附引導 U盤制作工具)

下載鏡像 安裝Ubuntu首先要下載鏡像包,訪問下面網址下載鏡像包 https://releases.ubuntu.com/ 選擇你要安裝的Ubuntu版本 將 .iso 文件保存到所需位置,下面會使用此文件創建可引導 U盤。 制作 Ubuntu 引導 U 盤 首先要找到一個大于4G的U盤&#xff…

貓頭虎 解析:為什么AIGC在國內適合做TOB,在國外適合做TOC?

貓頭虎 解析:為什么AIGC在國內適合做TOB,在國外適合做TOC? 博主 貓頭虎 的技術世界 🌟 歡迎來到貓頭虎的博客 — 探索技術的無限可能! 專欄鏈接: 🔗 精選專欄: 《面試題大全》 — 面…

ps進程查看命令詳解

1、PS 命令是什么 查看它的man手冊可以看到,ps命令能夠給出當前系統中進程的快照。它能捕獲系統在某一事件的進程狀態。如果你想不斷更新查看的這個狀態,可以使用top命令。 2、ps命令支持三種使用的語法格式 UNIX 風格,選項可以組合在一起…

鴻蒙ArkUI-X平臺差異化:【運行態差異化(@ohos.deviceInfo)】

平臺差異化 簡介 跨平臺使用場景是一套ArkTS代碼運行在多個終端設備上,如Android、iOS、OpenHarmony(含基于OpenHarmony發行的商業版,如HarmonyOS Next)。當不同平臺業務邏輯不同,或使用了不支持跨平臺的API&#xf…

c++中靜態函數

在Qt中,可以通過在類中定義靜態方法來添加靜態方法。靜態方法是類的一部分,但不需要實例化類對象就可以直接調用。 下面是一個示例,演示了如何在類中添加靜態方法: cpp class MyClass { public: static void myStaticMethod…

Postman快捷功能-批量斷言與快速查詢替換

大家好,在我們日常的接口測試工作中,經常需要對接口返回的數據進行斷言,以確保接口的正確性。當接口數量較多時,逐個編寫斷言語句會變得非常繁瑣。此外,在接口測試過程中,我們還可能需要頻繁地查找和替換某…

Python自動化工具(桌面自動化、Web自動化、游戲輔助)

工具介紹 連點工具是一款可以模擬鍵鼠后臺操作的連點器工具。支持鼠標連點、鍵鼠腳本錄制,支持輔助您實現辦公自動化以及輔助游戲操作。功能簡潔易用,非常方便操作。連點工具讓您在在玩游戲、網購搶購的時候全自動點擊鼠標!主要功能有&#…

MySQL數據庫的數據文件保存在哪?MySQL數據存在哪里

在安裝好MySQL數據庫使用一段時間后,會產生許多的數據庫和數據。那這些數據庫的數據文件存放在本地文件夾的什么位置呢 一、默認位置 一般來說MySQL數據庫的數據文件都是存放在data文件夾之中,但是根據使用的存儲引擎不同,產生的一些文件也…

牛客前端面試高頻八股總結(2)(附文檔)

1.fetch請求方式 fetch是什么? fetch是一種http 數據請求的方式,是xml的一種替代方式。 怎么請求? fetch方法返回一個promise解析response顯示狀態(成功與否)的方法。 優點: 使用Promise,支持鏈…

24李林跌落神壇,880還刷嗎?還是換1000、900、660?

“李林今年跌落神壇了!” “全是固定題型沒新題,結果今年考的全是新題。” 880是“老真題的神”, 遇到24年,冷門考點多,計算量又大,就不靈了。 但“老真題”,還是得刷。就像往年真題是要刷的…

(十一)統計學基礎練習題五(50道選擇題)

本文整理了統計學基礎知識相關的練習題,共50道,適用于想鞏固統計學基礎或備考的同學。來源:如荷學數據科學題庫(技術專項-統計學二)。序號之前的題請看往期文章。 201) 202) 203) 2…

得帆信息PMO總監李健達受邀為第十三屆中國PMO大會演講嘉賓

全國PMO專業人士年度盛會 上海得帆信息技術有限公司aPaaS業務線副總裁、PMO總監李健達先生受邀為PMO評論主辦的2024第十三屆中國PMO大會演講嘉賓,演講議題為“AI時代的PMO工作法”。大會將于6月29-30日在北京舉辦,敬請關注! 議題簡要&#x…

39. 組合總和 - 力扣(LeetCode)

基礎知識要求: Java: 方法、集合、泛型、Arrays工具類、for循環、if判斷 Python: 方法、列表、for循環、if判斷 題目: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使…