性能比拼: Go(Gin) vs Python(Flask)

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


在本視頻中,我們將比較 Golang 和 Python 的性能。

但我們不會采用純粹的算法方法,而是使用真實場景的例子。我們將構建兩個簡單的 REST 應用程序,不使用像 Fiber 這樣的最快庫,而是使用當前最流行的庫。其他在代碼中使用的庫也是如此,無論是官方庫,比如 Prometheus 客戶端,還是最受歡迎的第三方庫。

接下來,我們將比較每個應用程序的 CPU 使用情況,然后比較內存使用情況。最重要的是,我們將比較每個請求的延遲,并從客戶端側進行測量,這比僅僅對應用程序進行監測更準確。我們將在兩個測試中分別測量每秒請求數。

在第二個測試中,我們將測量 Python 和 Golang 從 S3 存儲桶中下載一張圖片所花費的時間。最后,我們將測量將最后修改日期存儲到 Postgres 數據庫中所需的平均延遲。

此外,我還將向您展示如何使用 OpenTelemetry 對 Python 和 Golang 應用進行監控,并在本地通過 Grafana 可視化追蹤信息,無需使用任何外部服務。

例如,從這個追蹤信息中你可以看到,整個請求大約耗時 7 毫秒,其中有 5 毫秒用于從 S3 下載圖片,1.5 毫秒用于將圖片元數據存儲到 Postgres 數據庫中。Python 應用也有相同的追蹤可顯示。

源代碼已發布在我的 GitHub 公共倉庫中。我將在下一期視頻中做一個逐步教程,演示如何使用 OpenTelemetry 項目對 Python 應用進行追蹤并暴露指標。

為了運行這些測試,我使用了一個擁有 8 核處理器和 64GB 內存的 VMware。我使用 kubeadm 工具安裝了最新版的 Kubernetes,并額外創建了一個專用 VM 用于 Postgres 數據庫。所有這些虛擬機都有 2 個虛擬 CPU 和 4GB 內存,除了 Postgres,它有 4 個 CPU 和 8GB 內存。

現在,我來解釋一下測試配置。

在第一個測試中,我們會將這兩個應用部署到 Kubernetes 中。為了運行測試,我們將使用一個客戶端應用,它將作為 Kubernetes Job 部署,用于生成流量。

首先,我們將使用 /api/devices 端點,它返回一個硬編碼的設備數組。因此,第一個測試將純粹比較 Python Flask 應用和 Golang Gin 應用。

然后,每個客戶端都在 /metrics 端點暴露 Prometheus 指標,我們將使用 Prometheus 來抓取它們的數據。通過這些數據,我們可以在 Grafana 儀表盤中可視化請求時長。

我們將使用 summary 類型的 Prometheus 指標來自動生成百分位數指標。

順便提醒一下,如果您的應用是水平擴展的,您無法跨實例聚合 summary 類型的指標,這種情況下需要使用帶有硬編碼桶的 histogram 類型。

在第二個測試中,我們將使用相同的應用,但使用的是 /api/images 端點。當客戶端訪問該端點時,每個應用將從 S3 存儲桶中下載一張圖片。我將使用 MinIO,它是一個兼容 S3 的對象存儲系統。

應用下載圖片后,將提取其最后修改日期,并將其保存在 Postgres 數據庫中。

在這個示例中,我們還將從應用本身暴露用于測量 S3 和 Postgres 請求延遲的指標。

此外,我們會使用 OpenTelemetry 創建追蹤數據,并通過 OTLP 協議將其導出到同樣部署在 Kubernetes 中的 Tempo。然后我們將使用 Grafana 中的數據源 Tempo 來查詢追蹤數據。

這就是本視頻的整個配置過程。

為了部署所有這些開源組件,如 Grafana、Prometheus、Tempo 和 MinIO,我使用了 Terraform 結合 Helm 和 kubectl 提供器。

你也可以在 GitHub 倉庫中找到 Golang 應用、Python 應用和客戶端。視頻中用到的所有內容都包含在該倉庫中,我還會在 README 文件中添加一些命令。


好了,我們開始運行第一個測試。

我們將逐漸增加請求數量,直到每個應用達到大約每秒 400 個請求。

一開始你就可以注意到,Python 應用的內存使用明顯更高。

順便說一下,我對兩個應用設置了相同的請求和限制:512MB 內存和 2 個核心的限制。

同樣的情況也出現在 CPU 使用上,Python Flask 應用使用了更多的 CPU。

但最重要的是,Python 的延遲幾乎是 Golang 應用的 4 倍,Python 大約是 4 到 5 毫秒,而 Golang 是 1 毫秒左右。

提醒一下,這些測試都是在同一臺服務器上運行的,因此請求中沒有網絡延遲。

好了,我將這個測試再運行幾秒鐘。整個測試大約花了 20 分鐘。

接下來,我會停止客戶端并重置 Prometheus。


接下來運行第二個測試,我們將從 S3 下載圖片并將數據存儲到 Postgres。

在這個測試中,我只向每個應用發送大約 20 個并發請求。

你可以看到內存使用基本不變。CPU 使用在這樣的低負載下也差不多。

但我們從客戶端側測得的總延遲,Python 依然明顯更高,大約為 20 到 25 毫秒,而 Golang 為 10 到 12 毫秒。

你還可以注意到,S3 下載函數的平均延遲差不多,但將數據保存到數據庫的時間幾乎少了一半。

我也會將這個測試再運行幾秒鐘。

現在,用 Python 開發應用更加容易,尤其是在你需要快速創建一個概念驗證項目時。你完全可以使用 Python。

Python 廣泛用于大數據和機器學習領域,如果這是你的使用場景,你當然繼續使用 Python。

但如果你需要實現更低的延遲和更高的效率,尤其是服務端應用,Golang 會是更好的選擇。

Rust 的效率更高,但它還未完全成熟,而且開發和維護都更困難。

如果你喜歡這類基準測試,我還有一個播放列表,比較不同語言和開源項目。

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

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

相關文章

Android版本更新服務通知下載實現

在日常開發中,我們肯定會有檢查版本更新的需求,那我版本更新的輪子網上也是有的,想自己實現一下代碼如下: 下載管理類: public class DownLoadManager {private static final String MAIN "main"; //Tagp…

UE5學習筆記 FPS游戲制作33 換子彈 動畫事件

新建動畫蒙太奇 為Rifle和Launcher各自新建一個動畫蒙太奇,拖入動畫,注意動畫的軌道要和動畫藍圖里的一致 在蒙太奇添加動畫事件 在通知一欄新增一個軌道,右鍵軌道,新增一個 換槍完成 通知,不同動畫的同名通知需要…

uniapp中uploadFile的用法

基本語法 uni.uploadFile(OBJECT)OBJECT 是一個包含上傳相關配置的對象,常見參數如下: 參數類型必填說明urlString是開發者服務器地址。filePathString是要上傳文件資源的本地路徑。nameString是文件對應的 key,開發者在服務端可以通過這個 …

Android設計模式之責任鏈模式

一、定義: 使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關系將這些對象連城一條鏈,并沿著這條鏈傳遞該請求,只到有對象處理它為止。 二、模式結構: 抽象處理者(Handler&#xff…

Oracle數據庫數據編程SQL<3.3 PL/SQL 游標>

游標(Cursor)是Oracle數據庫中用于處理查詢結果集的重要機制,它允許開發者逐行處理SQL語句返回的數據。 目錄 一、游標基本概念 1. 游標定義 2. 游標分類 二、靜態游標 (一)顯式游標 【一】不帶參數,普通的顯示游標 1. 顯式…

逗萬DareWorks|創意重構書寫美學,引領新潮無界的文創革命

當傳統文具陷入同質化泥潭時,逗萬DareWorks品牌猶如一顆璀璨的明星,以其獨特的創意理念和卓越的產品品質,迅速贏得了廣大消費者的青睞。 逗萬DareWorks隸屬于東莞司貿文教贈品有限公司,后者深耕制筆行業45年,占地4.6萬…

寫Prompt的技巧和基本原則

一.基本原則 1.一定要描述清晰你需要大模型做的事情,不要模棱兩可 2.告訴大模型需要它做什么,不需要做什么 改寫前: 請幫我推薦一些電影 改寫后: 請幫我推薦2025年新出的10部評分比較高的喜劇電影,不要問我個人喜好等其他問題&#xff…

【React】基于 React+Tailwind 的 EmojiPicker 選擇器組件

1.背景 React 寫一個 EmojiPicker 組件,基于 emoji-mart 組件二次封裝。支持添加自定義背景 、Emoji 圖標選擇!并在頁面上展示! 2.技術棧 emoji-mart/data 、emoji-mart : emoji 圖標庫、元數據 tailwindcss: 原子化 CSS 樣式庫 antd : 組…

Qt中繪制不規則控件

在Qt中繪制不規則控件可通過設置遮罩(Mask)實現。以下是詳細步驟: ?繼承目標控件?:如QPushButton或QWidget。?重寫resizeEvent?:當控件大小變化時,更新遮罩形狀。?創建遮罩區域?:使用QRegion或QPain…

Parallel_Scheduling_of_DAGs_under_Memory_Constraints論文閱讀

內存約束下的 DAG 并行調度 點擊閱讀原文語雀鏈接更清晰 摘要 科學工作流通常被建模為任務的有向無環圖(DAG),這些任務代表計算模塊及其依賴關系,依賴關系表現為任務生成的數據被其他任務使用。這種形式化方法允許使用運行時系統&…

探索MVC、MVP、MVVM和DDD架構在不同編程語言中的實現差異

MVC與MVP/MVVM/DDD架構對比,不同語言實現 MVC 分層架構設計概述 模型-視圖-控制器(Model-View-Controller,簡稱 MVC)是一種經典軟件架構設計,通過分層解耦,使得系統結構清晰和易于維護,具有良…

一文讀懂 UML:基礎概念與體系框架

UML 圖是一種標準化的建模語言,在軟件開發和系統設計等領域有著廣泛的應用。以下是對 UML 圖各類圖的詳細介紹: 1.用例圖 定義:用例圖是從用戶角度描述系統功能的模型圖,展現了系統的參與者與用例之間的關系。作用:幫…

Spring 及 Spring Boot 條件化注解(15個)完整列表及示例

Spring 及 Spring Boot 條件化注解完整列表及示例 1. 所有條件化注解列表 Spring 和 Spring Boot 提供了以下條件化注解(共 15 個),用于在配置類或方法上實現條件化注冊 Bean 或配置: 注解名稱作用來源框架Conditional自定義條件…

【Kafka】深入探討 Kafka 如何保證一致性

文章目錄 Kafka 基本概念回顧?副本角色? 數據寫入一致性?同步副本(ISR)集合?數據讀取一致性?故障處理與一致性恢復?總結? 在分布式系統領域,數據一致性是至關重要的一環。作為一款高性能的分布式消息隊列系統,Kafka 在設計…

從入門到精通:SQL注入防御與攻防實戰——紅隊如何突破,藍隊如何應對!

引言:為什么SQL注入攻擊依然如此強大? SQL注入(SQL Injection)是最古老且最常見的Web應用漏洞之一。盡管很多公司和組織都已經采取了WAF、防火墻、數據庫隔離等防護措施,但SQL注入依然在許多情況下能夠突破防線&#…

【算法day27】有效的數獨——請你判斷一個 9 x 9 的數獨是否有效。只需要 根據以下規則 ,驗證已經填入的數字是否有效即可。

36. 有效的數獨 請你判斷一個 9 x 9 的數獨是否有效。只需要 根據以下規則 ,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。(請參考示例…

leetcode 2360. 圖中的最長環 困難

給你一個 n 個節點的 有向圖 ,節點編號為 0 到 n - 1 ,其中每個節點 至多 有一條出邊。 圖用一個大小為 n 下標從 0 開始的數組 edges 表示,節點 i 到節點 edges[i] 之間有一條有向邊。如果節點 i 沒有出邊,那么 edges[i] -1 。…

PySpur: AI 智能體可視化開發平臺

GitHub:https://github.com/PySpur-Dev/pyspur 更多AI開源軟件:發現分享好用的AI工具、AI開源軟件、AI模型、AI變現 - 小眾AI PySpur是一個開源的輕量級可視化AI智能體工作流構建器,旨在簡化AI系統的開發流程。通過拖拽式界面,用戶…

vcpkg安裝及使用教程,以安裝matio庫解析mat文件為例

vcpkg安裝及使用教程,以安裝matio庫解析mat文件為例 1. vcpkg安裝2 安裝matio三方庫3 將三方庫集成到VS中3.1 全局集成3.2 集成到特定工程4 結語Vcpkg 是微軟開發的一款開源的 C/C++ 包管理工具,旨在簡化 C/C++ 項目依賴庫的安裝和管理。它支持跨平臺(Windows、Linux、macO…

LLM架構解析:NLP基礎(第一部分)—— 模型、核心技術與發展歷程全解析

本專欄深入探究從循環神經網絡(RNN)到Transformer等自然語言處理(NLP)模型的架構,以及基于這些模型構建的應用程序。 本系列文章內容: NLP自然語言處理基礎(本文)詞嵌入&#xff0…