性能比拼: Go標準庫 vs Python FastAPI(第二輪)

本內容是對知名性能評測博主 Anton Putra Python (FastAPI) vs Go (Golang) (Round 2) Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準

介紹

這是第二輪關于 FastAPIGolang 的對比測試。我幾天前運行了前一次的基準測試,到目前為止,我已經收到了 13 個關于 Python 性能改進的 Pull Request。如果你是一名開發者,我建議你先觀看之前的基準測試,并對比視頻描述中提供的源碼和所有的 Pull Request,這樣可以幫助你避免我在上一次基準測試中犯的錯誤。

在第一輪測試中,我們將測量以下指標:

  1. 使用 90% 分位數 測量客戶端每個請求的延遲。
  2. 使用每秒請求數(Requests Per Second)來衡量吞吐量。
  3. 應用程序的 CPU 使用率。
  4. 內存使用情況。
  5. 可用性或錯誤率。
  6. CPU 限制(CPU Throttling)情況。
    這些測試將在 AWS 的生產級 Kubernetes 集群中運行。

在第二輪測試中,我們將模擬一個真實的用例:應用程序接收請求后,將數據保存到關系型數據庫中,并使用緩存來提高性能。數據庫使用 Postgres 17.2,緩存使用 Memcached。如果你感興趣,可以觀看我之前對比 RedisMemcached 的視頻結果(結果差距很大)。

所有的基準測試都在 AWS 上運行,使用了不同類型的 EC2 實例。目前,我主要使用基于 ARM 架構的 Graviton 實例,因為它們價格更低。

  • Postgres 使用存儲優化型的 i8g.large 實例。

  • 緩存使用 m8g.large 實例。

  • Kubernetes 集群中的監控組件(如 PrometheusGrafana)及負載生成客戶端,運行在計算優化型實例上。

  • 每個應用程序運行在專用虛擬機上,使用了 m7a.large 實例,并通過 TolerationsAffinity 設置實現隔離(以能夠使它們運行在自己專用的虛擬機上面)。

AWS 的費用不低,為了支持我的頻道和支付這些基礎設施成本,我提供一對一咨詢和其他服務。詳情請查看視頻描述。


第一輪測試(靜態內容)

好了,讓我們開始第一輪測試。這是第二輪測試了,我建議你先觀看使用未經優化的 Python 代碼進行的第一次基準測試,然后與這次測試進行對比。在第一輪測試中,我們讓應用返回硬編碼的對象。

這次測試中:

  • 我使用了 FastAPI 推薦的默認 Web 服務器 Uvicorn,并配置了兩個工作線程(workers)。
  • 端點使用了異步處理(Async Handler)。

雖然在第一次基準測試中性能稍好,但最終還是失敗了并恢復運行。

在這次測試中,性能稍微更穩定,但只能達到 每秒 11,000 請求。雖然差距不是很大,但對性能還是有影響。在運行到每秒約 11,000 請求時,由于 CPU 限制,開始出現失敗,延遲大幅上升,可用性下降。

我原本期望經過這些優化和收到的眾多 Pull Request(你可以在視頻描述中找到所有這些 Pull Request),性能會更好。不過,我會繼續運行測試,直到 Go 應用程序也開始出現失敗。

Golang 的表現依舊出色,可以達到 每秒 60,000 到 65,000 請求,這是非常不錯的性能。雖然不是最頂尖的,但一些語言(比如 RustZig)在類似測試中可以達到 每秒 100,000 請求。但無論如何,在這次測試中,Go 的效率遠遠高于 FastAPI。

接下來,我們打開每個測試指標的圖表:

  1. 每秒請求數(Requests Per Second)
    • Python 達到了 每秒 11,000 請求,而 Go 達到了 每秒 66,000 請求

  1. 延遲(Latency)

    • 對于面向客戶端的應用程序來說,延遲是最重要的指標之一,而 Go 在這一點上表現得更好。

  1. CPU 使用率
    • FastAPI 很快耗盡了所有可用 CPU。

  1. 可用性(Availability)

  1. 內存使用(Memory Usage)

  1. CPU 限制(CPU Throttling)

在這次測試中,FastAPI 的表現并不好。但我會繼續測試其他 Python 框架,例如 Starlette(FastAPI 的底層框架),或者直接創建一個 ASGI Python 應用,看看能否接近 Go 應用的性能。


第二輪測試(Postgres + Memcached)

第二輪測試主要針對真實場景的改進,結果確實在真實用例中有顯著提升。在這個測試中,應用程序需要:

  1. 解析請求體。
  2. 將記錄插入到關系型數據庫中。
  3. 將數據緩存到 Redis 或 Memcached 中。

如果你想改進你的 Python 應用程序,我建議對比兩種實現,并查看儀表板上的性能差異。

在之前的基準測試中,FastAPI 只能達到 每秒 750 請求。在這次改進后,性能提升到了 每秒 2,500 請求。相比之前的測試,這是一個巨大的改進,但仍遠不及 Go 應用。

在這次測試中,我們還測量了以下指標的延遲:

  • 數據庫插入操作的延遲。
  • 保存數據到緩存的函數調用延遲。
  • 總體 POST 請求的延遲。

雖然 Python 表現比之前好了許多,但在性能上仍然遠不及 Go 應用。這次測試中,我收到了很多 Pull Request,但這已經是目前的最佳性能了。我覺得需要嘗試其他 Python 框架,尋找能夠接近 Go 應用性能的解決方案。

未來,我將只測試 Python 框架,比如 DjangoFlaskFastAPI

接下來打開每個測試指標的圖表:

  1. 每秒請求數(Requests Per Second)

  • FastAPI 最高達到了 每秒 2,600 請求,而 Go 達到了 每秒 20,000 請求
  • 在之前的測試中,Go 的性能受限于 Memcached 的連接數設置。這次測試中,我增加了閑置連接數限制,所以 Go 能夠充分利用 CPU,達到更高的請求數。
  1. 總體 POST 請求延遲(Overall Latency for POST Requests)

  1. 數據庫操作延遲(Database Operation Latency)

  1. 緩存延遲(Cache Latency)

  1. CPU 使用率(CPU Usage)

  1. Postgres 和 Memcached 的 CPU 使用率

  • 從圖中可以看到,對于相同數量的數據庫和緩存請求,緩存只需要很少的資源。因此,使用緩存不僅可以顯著提高應用性能,還可以通過減少資源使用來降低基礎設施成本。
  1. Postgres 連接池(Connection Pool)

  • 每個應用程序創建并維護了一個最大連接數為 500 的 Postgres 連接池。
  1. 內存使用(Memory Usage)


總結

我將繼續尋找并測試更快的 Python 框架。如果你感興趣,可以查看我其他的基準測試視頻。感謝觀看,我們下次見!

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

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

相關文章

DeepSeek與ChatGPT的優勢對比:選擇合適的工具來提升工作效率

選DeepSeek還是ChatGPT?這就像問火鍋和披薩哪個香! "到底該用DeepSeek還是ChatGPT?” 這個問題最近在互聯網圈吵翻天!其實這就跟選手機系統-樣,安卓黨iOS黨都能說出一萬條理由,但真正重要的是你拿它來干啥!&am…

Python爬蟲第4節-請求庫urllib的request模塊使用

目錄 前言:基本庫urllib的使用 一、urlopen方法 二、Request類 三、高級用法 前言:基本庫urllib的使用 開始學習爬蟲時,第一步就是要模擬瀏覽器給服務器發送請求。這個時候,你可能會有很多問題:該從哪里開始做呢&a…

Vue3 Pinia Store使用示例

代碼示例: import { defineStore } from "pinia"; // 導入 Pinia 的 defineStore 方法 import { ref } from "vue"; // 導入 Vue 的響應式 API ref import { type Menu } from "/interface"; // 導入自定義的 Menu 類型/…

JavaScript逆向魔法:Chrome開發者工具探秘之旅

在前端開發和安全研究領域,JavaScript逆向工程是一項關鍵技能。它涉及分析和理解代碼的執行流程、數據結構和邏輯,以發現潛在的安全漏洞、提取核心算法或實現功能兼容。本文將結合Chrome開發者工具的調試功能,并通過具體示例幫助你更好地理解…

Qt基礎:資源文件

資源文件 1. 資源文件2. 資源文件創建 1. 資源文件 資源文件顧名思義就是一個存儲資源的文件,在Qt中引入資源文件好處在于他能提高應用程序的部署效率并且減少一些錯誤的發生。 在程序編譯過程中, 添加到資源文件中的文件也會以二進制的形式被打包到可執…

Agent TARS與Manus的正面競爭

Agent TARS 是 Manus 的直接競爭對手,兩者在 AI Agent 領域形成了顯著的技術與生態對抗。 一、技術架構與功能定位的競爭 集成化架構 vs 模塊化設計 Agent TARS 基于字節跳動的 UI-TARS 視覺語言模型,將視覺感知、推理、接地(grounding&#…

使用ssh連接上開發板

最后我發現了問題,我忘記指定用戶名了,在mobaXterm上左上角打開會話,點擊ssh,然后輸入要連接的開發板主機的ip地址,關鍵在這里,要指定你要連接的開發板的系統中存在的用戶,因為通過ssh連接一個設…

【性能優化點滴】odygrd/quill在編譯期做了哪些優化

Quill 是一個高性能的 C 日志庫,它在編譯器層面進行了大量優化以確保極低的運行時開銷。以下是 Quill 在編譯器優化方面的關鍵技術和實現細節: 1. 編譯時字符串解析與格式校驗 Quill 在編譯時完成格式字符串的解析和校驗,避免運行時開銷&…

【數據結構】排序算法(中篇)·處理大數據的精妙

前引:在進入本篇文章之前,我們經常在使用某個應用時,會出現【商品名稱、最受歡迎、購買量】等等這些榜單,這里面就運用了我們的排序算法,作為剛學習數據結構的初學者,小編為各位完善了以下幾種排序算法&…

混雜模式(Promiscuous Mode)與 Trunk 端口的區別詳解

一、混雜模式(Promiscuous Mode) 1. 定義與工作原理 定義:混雜模式是網絡接口的一種工作模式,允許接口接收通過其物理鏈路的所有數據包,而不僅是目標地址為本機的數據包。工作層級:OSI 數據鏈路層&#x…

大學生機器人比賽實戰(一)綜述篇

大學生機器人比賽實戰 參加機器人比賽是大學生提升工程實踐能力的絕佳機會。本指南將全面介紹如何從零開始準備華北五省機器人大賽、ROBOCAN、RoboMaster等主流機器人賽事,涵蓋硬件設計、軟件開發、算法實現和團隊協作等關鍵知識。 一、比賽選擇與準備策略 1.1 主…

【Linux】動靜態庫知識大梳理

親愛的讀者朋友們😃,此文開啟知識盛宴與思想碰撞🎉。 快來參與討論💬,點贊👍、收藏?、分享📤,共創活力社區。 在 Linux 系統編程中,動靜態庫是重要的組成部分&#xff0…

06-公寓租賃項目-后臺管理-公寓管理篇

尚庭公寓項目/公寓管理模塊 https://www.yuque.com/pkqzyh/qg2yge/5ba67653b51379d18df61b9c14c3e946 一、屬性管理 屬性管理頁面包含公寓和房間各種可選的屬性信息,其中包括房間的可選支付方式、房間的可選租期、房間的配套、公寓的配套等等。其所需接口如下 1.1…

Links for llama-cpp-python whl安裝包下載地址

Links for llama-cpp-python whl安裝包下載地址 Links for llama-cpp-python whl安裝包下載地址 https://github.com/abetlen/llama-cpp-python/releases

為境外組織提供企業商業秘密犯法嗎?

企業商業秘密百問百答之九十六:為境外組織提供企業商業秘密犯法嗎? 在日常的對外交流中,企業若暗中為境外的機構、組織或人員竊取、刺探、收買或非法提供商業秘密,這種行為嚴重侵犯了商業秘密權利人的合法權益,更深遠…

grep 命令詳解(通俗版)

1. 基礎概念 grep 是 Linux 下的文本搜索工具,核心功能是從文件或輸入流中篩選出包含指定關鍵詞的行。 它像“文本界的搜索引擎”,能快速定位關鍵信息,特別適合日志分析、代碼排查等場景。 2. 基礎語法 grep [選項] "搜索詞" 文件…

JSVMP逆向實戰:原理分析與破解思路詳解

引言 在當今Web安全領域,JavaScript虛擬機保護(JSVMP)技術被廣泛應用于前端代碼的保護和反爬機制中。作為前端逆向工程師,掌握JSVMP逆向技術已成為必備技能。本文將深入剖析JSVMP的工作原理,并分享實用的逆向破解思路…

【youcans論文精讀】弱監督深度檢測網絡(Weakly Supervised Deep Detection Networks)

歡迎關注『youcans論文精讀』系列 本專欄內容和資源同步到 GitHub/youcans 【youcans論文精讀】弱監督深度檢測網絡 WSDDN 0. 弱監督檢測的開山之作0.1 論文簡介0.2 WSDNN 的步驟0.3 摘要 1. 引言2. 相關工作3. 方法3.1 預訓練網絡3.2 弱監督深度檢測網絡3.3 WSDDN訓練3.4 空間…

基于Contiue來閱讀open-r1中的GRPO訓練代碼

原創 快樂王子HP 快樂王子AI說 2025年04月03日 23:54 廣東 前面安裝了vscode[1]同時也安裝了Coninue的相關插件[2],現在想用它們來閱讀一下open-r1項目的代碼[3]。 首先,從啟動訓練開始(以GRPO為例子) 第一步,使用TRL的vLLM后端…

JVM深入原理(六)(二):雙親委派機制

目錄 6.5. 類加載器-雙親委派機制 6.5.1. 雙親委派機制-作用 6.5.2. 雙親委派機制-工作流程 6.5.3. 雙親委派機制-父加載器 6.5.4. 雙親委派機制-面試題 6.5.5. 雙親委派機制-代碼主動加載一個類 6.6. 類加載器-打破雙親委派機制 6.6.1. 打破委派-ClassLoader原理 6.6.…