Go Http 框架性能測評: Fiber vs- Gin vs- Go 標準庫
本內容是對知名性能評測博主 Anton Putra Fiber vs. Gin vs. Go (stdlib): Performance (Latency - Throughput - Saturation - Availability)[1]: Performance (Latency - Throughput - Saturation - Availability) 內容的翻譯與整理, 有適當刪減, 相關內容和結論以原作地址爲準
介紹
在本視頻 [2] 中,我們將對比 Fiber 和 Gin 這兩個 HTTP 框架,以及 Golang 標準庫 和 Go 1.22 版本新增的改進型多路複用器。爲了進行測試,我會將這些應用部署到 Kubernetes,然後使用 Prometheus 監測 CPU 和 內存 的使用情況,並在 Grafana 中進行可視化展示。
我們還會對比 客戶端延遲 以及每個框架所能處理的 每秒請求數(RPS)。在這次測試中,我增加了外部客戶端的數量,以產生足夠的負載,從而迫使 Kubernetes 對這些應用進行調節。最終,我們會得出一個 明確的勝者。
爲了運行此次測試,我在 AWS 上創建了一個 生產級 Kubernetes 集羣,並使用了 m6a.4xlarge 實例類型。如果你想了解更多相關內容,我還有一門專門針對 EKS 初學者 的完整課程 [3]。
框架概述
在 Go 1.22 版本之前,僅使用 Go 標準庫 來開發 REST API 是一項十分困難的任務。其主要原因之一是:標準庫中的 HTTP 請求多路複用器(multiplexer)不支持將 URI 模式映射到 HTTP 方法,而這對於設計 RESTful 資源至關重要。因此,許多開發者最終選擇了使用諸如 Gin 或 Fiber 之類的 第三方路由庫。 (還有如 Gorilla Mux,Chi)
但到了 Go 1.22 之後,其標準庫已經足夠強大,你 不再需要 額外的第三方 Web 框架來構建 REST API。當然,你仍然可以使用一些 外部中間件 來提高開發效率,但標準庫 已經具備了所有必要的功能。
測試
現在,讓我們開始部署這些應用到 Kubernetes,並讓它們在 空閒狀態 下運行 10-15 分鐘。
可以看到,Gin 框架 運行時的 內存和 CPU 佔用略高,而 Go 標準庫 的資源使用情況與 Fiber 相當接近。
正式測試
接下來,我將部署 20 個客戶端 來爲每個應用 生成流量,並逐步 增加請求量。整個測試耗時 約 1.5 小時,在視頻中將其壓縮成數分鐘,並在最後展示最終結果。
從測試流程來看,每 5 分鐘,我們會 增加額外的 1000 RPS 負載 到每個應用。從一開始,我們就能觀察到明顯的趨勢:
-
Gin 佔用 更多的 CPU 和內存,並且 客戶端延遲最高。
-
Go 標準庫 的 資源佔用接近 Fiber,但其 延遲略高於 Fiber。
-
Fiber 的 CPU 和內存使用率最低,並且 延遲最低,在所有框架中表現最佳。
Fiber 基於 Fasthttp 框架,但很多人不喜歡它。Fasthttp 是一個 非標準的 HTTP 實現,它主要 專注於特定場景的高性能優化。除非你 確實需要它的特定優勢,並且瞭解相關風險,否則它 並不是一個推薦的默認選擇。甚至 官方文檔 也建議 大多數情況下應使用標準的 http 庫。
推至極限
讓我們繼續運行測試,直到所有應用 開始崩潰。
-
Gin 最先 達到了 Kubernetes 設定的 Pod 資源限制,導致 Kubernetes 開始對其進行調節(throttling),這直接 影響了性能,並增加了延遲。如果你在 Kubernetes 中運行 CPU 密集型應用,一定要 監控 throttling 的情況。
-
從 每秒請求數(RPS)圖表 可以看到,Gin 在 2 個 CPU 和 256MB 內存的 Pod 限制 下,最多隻能處理 15,000 個請求。
- 其次,Go 標準庫 也開始 失敗,並被 Kubernetes 限流,這導致其 延遲上升。在同樣的配置下,它最多能處理 17,000 RPS。
- 最後,Fiber 也達到了極限,在約 20,000 RPS 時 開始退化。
測試結果分析
接下來,我們分別查看 整個測試期間的各項數據圖表。
-
每秒請求數(RPS):展示了每個應用的最大吞吐量。
-
客戶端延遲:測量了從客戶端角度的響應時間。
- CPU 使用率:直觀反映了每個框架的計算資源消耗情況。
- Kubernetes 限流(Throttling):在理想狀態下應爲 0 秒,但由於我們將應用推至極限,Kubernetes 開始對它們進行 限流。
- 內存使用情況:展示了每個應用的內存消耗。
最終,Fiber 是本次測試毫無疑問的贏家,但它 並不適用於所有場景。從我的個人觀點來看,你可以 嘗試在下一個 Go Web 或 REST 項目中使用標準庫,因爲它 已經具備所有必要的功能。
總結
如果你對 源代碼 有任何改進建議,歡迎提交 Pull Request,我一定會 審覈並進行測試。同時,也歡迎在 評論區 告訴我 你希望我測試哪些內容。
參考資料
[1]
Fiber vs. Gin vs. Go (stdlib): Performance (Latency - Throughput - Saturation - Availability): https://www.youtube.com/watch?v=ok5DDDNsOaQ
[2]
本視頻: https://www.youtube.com/watch?v=ok5DDDNsOaQ
[3]
EKS 初學者 的完整課程: https://www.youtube.com/watch?v=aRXg75S5DWA&list=PLiMWaCMwGJXnKY6XmeifEpjIfkWRo9v2l
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/3dHv9czhkIBguytGUK6coA