性能比拼: Elixir vs Go(第二輪)

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

這是第二輪關于 ElixirGo 的對比測試。我收到了一份來自 Elixir 創作者的 Pull Request ,并且我認為有必要分享他所做的一些改進。他還表示,在 Kubernetes 環境下比較這兩種語言是沒問題的,我只需要為應用程序分配整個 VM(虛擬機)。因此,我使用了 Tolerations(容忍度)和 Affinity(親和性)來實現這一點。


第一輪測試

在第一輪測試中,我們的目標是返回硬編碼的對象給客戶端,并測量 P90(90% 分位數)的延遲。同時,我們還會通過每秒請求數(Requests per Second,簡稱 RPS)的指標來衡量吞吐量,并記錄以下關鍵數據:

  • CPU 使用率
  • 內存使用率
  • 可用性(錯誤率)
  • CPU 限流(Throttling)

由于我們會將這兩個應用程序部署到 AWS 上的生產級 Kubernetes 集群,因此這些指標至關重要。這次 Pull Request 帶來了一些改進,我建議你也可以與之前的基準測試進行對比。


第二輪測試

第二輪測試模擬了一個更接近實際應用場景的案例:

  • 當應用程序接收到 POST 請求時,它會解析請求體,并將記錄插入到關系型數據庫中,然后返回數據庫生成的 ID 給客戶端。
  • 除了前述的性能指標,我們還會額外測量:
    • 數據庫操作的延遲(通過內部監測每個應用程序)
    • 數據庫的 CPU 使用率(使用 Node Exporter 進行監測)
    • 應用程序創建的數據庫連接池大小(使用 Postgres Prometheus Exporter 監測)

所有的基準測試都在 AWS 上運行。在本次測試中,我使用了一臺 存儲優化型 Graviton2 xlarge 實例 作為數據庫服務器。不過,我認為未來可能需要升級它。此外,我還創建了一個 EKS 集群,其中:

  • 計算優化型節點 用于 PrometheusGrafana客戶端 生成負載。
  • M7A Large 實例 用于運行應用程序,每個應用程序都部署在自己的 EC2 實例上。

AWS 并不便宜,為了支持我的頻道,我提供 一對一咨詢服務。如果你感興趣,可以在視頻描述中找到更多信息。


開始執行第一輪測試

整個測試持續 1.5 小時,但我會將其壓縮到 1.5 分鐘 的展示時間。此外,你可以在此處找到 完整的源代碼。


第一輪測試結果

1. 每秒請求數(Requests per Second, RPS)

  • Elixir 處理了 20,000 RPS,比之前的基準測試提升了 2,000 RPS,可以看到一定的性能提升。
  • Go 預期達到了 60,000 RPS,依然領先。
2. 客戶端延遲

  • Elixir 的延遲相比之前的基準測試略有降低,延遲越低越好
  • 但它仍然遠遠落后于 Go 的性能。
3. CPU 使用率

  • CPU 使用率越高,吞吐量越低,延遲越高,這并不意外。
  • Elixir 在這個測試中表現不如 Go,至少在這個特定的工作負載下。
4. 可用性(錯誤率)

  • 可用性 通過每秒錯誤數來衡量,錯誤數越低,代表系統越穩定。
  • 這個圖表展示的是每秒錯誤數,錯誤數越高,代表可用性下降。
5. 內存使用情況

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • 之前已經預料到,在 Go 崩潰之前,它的內存使用率會不斷上升
6. CPU 限流(CPU Throttling)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • ElixirCPU Throttling 現象更嚴重,因為它更早達到 CPU 使用率的上限,相比之下 Go 應用程序的 CPU 資源管理更高效。

這一輪靜態測試的結果可以作為后續測試的基準。


開始執行第二輪測試

這輪測試的展示時間同樣壓縮到了 1.5 分鐘


第二輪測試結果

1. 每秒請求數(Requests per Second, RPS)

  • 這次測試中,相較于之前的基準測試,并沒有明顯的提升,甚至可以說有輕微的下降
  • Go 在兩次測試中都穩定在 22,000 RPS
2. POST 請求延遲

  • Elixir 的延遲相比之前的測試有所降低,表現略有提升,但仍然不及 Go
3. 數據庫插入延遲

  • 大部分請求的延遲都來自數據庫操作,這在預期之內。
  • 我按照建議創建了 4 個數據庫連接池,每個池有 125 個連接
4. CPU 使用率

  • 這里沒有太多意外的發現。
  • 未來我可能需要增加數據庫連接池的大小,以便讓 CPU 資源利用率達到更高水平。
  • 數據庫連接池大小網絡 I/O 通常是瓶頸,連接數越多,吞吐量越大。但同時,也需要監控數據庫本身的健康狀況,確保它不會成為新的瓶頸。
5. 可用性

  • 這次測試中,我將超時時間增加到 5 秒,因此沒有看到錯誤
6. PostgreSQL 數據庫的 CPU 使用

  • 上一次測試 使用的是 AMD 處理器,這次測試采用的是 Graviton4 第四代處理器
7. 數據庫連接池大小

  • Elixir 應用在啟動時會立即創建 500 個數據庫連接
  • Go 則會根據負載逐步增加連接數
  • 我認為未來可能需要將連接數增加至 1,000,以進一步優化性能。
  • 值得一提的是,Amazon RDS 默認的最大連接數是 5,000,所以應該不會有太大問題。
8. 內存使用情況

  • 如果你有更好的優化方案,歡迎提交 Pull Request
  • 我總是愿意承認自己的錯誤,并在合理的情況下重新運行測試

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

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

相關文章

接口自動化 ——fixture allure

一.參數化實現數據驅動 上一篇介紹了參數化,這篇 說說用參數化實現數據驅動。在有很多測試用例的時候,可以將測試用例都存儲在文件里,進行讀寫調用。本篇主要介紹 csv 文件和 json 文件。 1.讀取 csv 文件數據 首先創建 csv 文件&#xff…

`peft`(Parameter-Efficient Fine-Tuning:高效微調)是什么

peft(Parameter-Efficient Fine-Tuning:高效微調)是什么 peft庫是Hugging Face推出的用于高效參數微調的庫,它能在不調整模型全部參數的情況下,以較少的可訓練參數對預訓練模型進行微調,從而顯著降低計算資源需求和微調成本。以下從核心功能、優勢、常見微調方法、使用場…

編程常見錯誤歸類

上一篇講了調試&#xff0c;今天通過一個舉例回憶一下上一篇內容吧&#xff01; 1. 回顧&#xff1a;調試舉例 在VS2022、X86、Debug的環境下&#xff0c;編譯器不做任何優化的話&#xff0c;下?代碼執?的結果是啥&#xff1f; #include <stdio.h> int main() {int …

在windows上交叉編譯opencv供RK3588使用

環境 NDK r27、RK3588 安卓板子、Android 12 步驟操作要點1. NDK 下載選擇 r27 版本&#xff0c;解壓到無空格路徑&#xff08;如 C:/ndk&#xff09;2. 環境變量配置添加 ANDROID_NDK_ROOT 和工具鏈路徑到系統 PATH3. CMake 參數調整指定 ANDROID_NATIVE_API_LEVEL31、ANDRO…

淺析MySQL事務鎖

在 MySQL 中,事務鎖是用于確保數據一致性和并發控制的重要機制。事務鎖可以幫助防止多個事務同時修改同一數據,從而避免數據不一致和臟讀、不可重復讀、幻讀等問題。 以下是 MySQL 事務鎖的關鍵點總結: 事務鎖:用于確保數據一致性和并發控制。鎖的類型: 行級鎖:InnoDB,粒…

vue3 文件下載(excel/rar/zip)

安裝axios npm install axios 在項目中引入 import axios from axios; 1、get接口excel文件下載 const file_key ref() const downLoadExcel (value:any) > {//file_key.value value axios({method: "get",url: "/api/da/download_excel/",//url:…

RT-Thread RTThread studio 初使用

RT-Thread Studio 下載 https://www.rt-thread.org/studio.html 安裝使用 https://bbs.elecfans.com/jishu_2425653_1_1.html 4 編譯問題解決 問題一&#xff1a;error: unknown type name clock_t 具體的類型值是在sys/_types.h中定義的&#xff0c;需要包含sys/_types.h 這個…

漢諾塔專題:P1760 通天之漢諾塔 題解 + Problem D: 漢諾塔 題解

1. P1760 通天之漢諾塔 題解 題目背景 直達通天路小A歷險記第四篇 題目描述 在你的幫助下&#xff0c;小 A 成功收集到了寶貴的數據&#xff0c;他終于來到了傳說中連接通天路的通天山。但是這距離通天路仍然有一段距離&#xff0c;但是小 A 突然發現他沒有地圖&#xff0…

探索 HumanoidBench:類人機器人學習的新平臺

在科技飛速發展的當下&#xff0c;類人機器人逐漸走進我們的視野&#xff0c;它們有著和人類相似的外形&#xff0c;看起來能像人類一樣在各種環境里完成復雜任務&#xff0c;潛力巨大。但實際上&#xff0c;讓類人機器人真正發揮出實力&#xff0c;還面臨著重重挑戰。 這篇文…

數據結構中的寶藏秘籍之廣義表

廣義表&#xff0c;也被稱作列表&#xff08;Lists&#xff09;&#xff0c;是一種遞歸的數據結構。它就像一個神秘的盒子&#xff0c;既可以裝著單個元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套著其他的盒子&#xff08;子列表&#xff09;。比如廣義表 (a (b c)…

【jenkins】首次配置jenkins

第一步&#xff0c;輸入管理員密碼 cat /var/jenkins_home/secrets/initialAdminPassword第二步&#xff0c;點擊安裝推薦的插件 第三步&#xff0c;創建管理員用戶 第四步&#xff0c;返回實例 第五步&#xff0c; 升級jenkins 第六步&#xff0c; 修復提示 第七步&#xff0c…

Android studio—socketIO庫return與emit的使用

文章目錄 一、Socket.IO庫簡單使用說明1. 后端 Flask Flask-SocketIO2. Android 客戶端集成 Socket.IO3. 布局文件注意事項 二、接受服務器消息的二種方法1. 客戶端接收通過 emit 發送的消息功能使用場景后端代碼&#xff08;Flask-SocketIO&#xff09;客戶端代碼&#xff08…

用Prompt 技術【提示詞】打造自己的大語言智能體

機器如何按照人類的指令執行任務的探索 機器需具備理解任務敘述的能力&#xff0c;以便能夠按照人類的指令執行任務&#xff0c;為機器提供一些范例作為參考&#xff0c;使其能夠理解該執行的任務類型。這樣的學習方式稱為“Instruction learning”&#xff0c;透過精心設計的…

Node.js 數據庫 事務 項目示例

1、參考&#xff1a;JavaScript語言的事務管理_js 函數 事務性-CSDN博客 或者百度搜索&#xff1a;Nodejs控制事務&#xff0c; 2、實踐 2.1、對于MySQL或MariaDB&#xff0c;你可以使用mysql或mysql2庫&#xff0c;并結合Promise或async/await語法來控制事務。 使用 mysql2…

【Mamba】MambaVision論文閱讀

文章目錄 MambaVision一、研究背景&#xff08;一&#xff09;Transformer vs Mamba?&#xff08;二&#xff09;Mamba in CV? 二、相關工作?&#xff08;一&#xff09;Transformer 在計算機視覺領域的進展?&#xff08;二&#xff09;Mamba 在計算機視覺領域的探索? 三、…

前端面試寶典---原型鏈

引言----感謝大佬的講解 大佬鏈接 原型鏈示意圖 原型鏈問題中需要記住一句話&#xff1a;一切變量和函數都可以并且只能通過__proto__去找它所在原型鏈上的屬性與方法 原型鏈需要注意的點 看上圖可以發現 函數&#xff08;構造函數&#xff09;也可以通過__proto__去找到原…

C語言---FILE結構體

一、FILE 結構體的本質與定義 基本概念 FILE 是 C 語言標準庫中用于封裝文件操作的結構體類型&#xff0c;定義于 <stdio.h> 中。它代表一個“文件流”&#xff0c;可以是磁盤文件、標準輸入輸出&#xff08;stdin/stdout/stderr&#xff09;或其他輸入輸出設備。 實現特…

基于大模型的直腸息肉診療全流程風險預測與方案優化研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、大模型技術概述 2.1 大模型原理簡介 2.2 大模型在醫療領域應用現狀 三、直腸息肉術前預測與準備 3.1 基于大模型的術前風險預測 3.1.1 息肉性質預測 3.1.2 手術難度預測 3.2 基于預測結果的術前準備 3.…

華為OD機試真題——MELON的難題(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《MELON的…

AI數據分析與BI可視化結合:解鎖企業決策新境界

大家好&#xff0c;今天我們來聊聊一個前沿而熱門的話題——AI數據分析與BI可視化結合&#xff0c;如何攜手推動企業決策邁向新高度。在數據爆炸的時代&#xff0c;企業如何高效利用這些數據&#xff0c;成為制勝的關鍵。AI數據分析與BI可視化的結合&#xff0c;正是解鎖這一潛…