最快的 Go 網絡框架 gnet 來啦!

gnet 是什麼?

gnet 是一個基於事件驅動的高性能且輕量級的網絡框架。它直接使用 epollkqueue 系統調用而非標準 Golang 網絡包:net 來構建網絡應用,它的工作原理類似兩個開源的網絡庫:nettylibuv

gnet 設計開發的初衷不是爲了取代 Go 的標準網絡庫:net,而是爲了創造出一個類似於 RedisHaproxy 能高效處理網絡包的 Go 語言網絡服務器框架。

gnet 的亮點在於它是一個高性能、輕量級、非阻塞的純 Go 實現的傳輸層(TCP/UDP/Unix Domain Socket)網絡框架,開發者可以使用 gnet 來實現自己的應用層網絡協議(HTTP、RPC、Redis、WebSocket 等等),從而構建出自己的應用層網絡應用:比如在 gnet 上實現 HTTP 協議就可以創建出一個 HTTP 服務器 或者 Web 開發框架,實現 Redis 協議就可以創建出自己的 Redis 服務器等等。

開源地址:https://github.com/panjf2000/gnet

v1.0.0 正式版本

從 2019 年 9 月份開放源碼到 GitHub,經過半年多的新功能開發、bug 修復、架構設計重構以及性能優化,Go 語言網絡框架 gnet 現在終於發佈了第一個正式的 v1 穩定版本!具體的 release 列表可以到 https://github.com/panjf2000/gnet/releases 查看。往後還會持續不斷地進行開發、修復、優化甚至重構,如果 gnet 的用戶在使用的過程中發現 bug,隨時到 gnetGithub Issue 頁 給我提 issue。

目前,gnet 具備瞭如下的功能特性:

  • 高性能 的基於多線程/Go 程網絡模型的 event-loop 事件驅動
  • 內置 goroutine 池,由開源庫 ants 提供支持
  • 內置 bytes 內存池,由開源庫 bytebufferpool 提供支持
  • 簡潔的 APIs
  • 基於 Ring-Buffer 的高效內存利用
  • 支持多種網絡協議/IPC 機制:TCP、UDP 和 Unix Domain Socket
  • 支持多種負載均衡算法:Round-Robin(輪詢)、Source Addr Hash(源地址哈希)和 Least-Connections(最少連接數)
  • 支持兩種事件驅動機制:Linux 裏的 epoll 以及 FreeBSD 裏的 kqueue
  • 支持異步寫操作
  • 靈活的事件定時器
  • SO_REUSEPORT 端口重用
  • 內置多種編解碼器,支持對 TCP 數據流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,參考自 netty codec,而且支持自定製編解碼器
  • 支持 Windows 平臺,基於 IOCP 事件驅動機制 Go 標準網絡庫
  • 實現 gnet 客戶端

上面列表中除了一些最基本的功能特性,後來的新功能都是由 gnet 的用戶提出、我開發實現的,在此感謝這些同學的貢獻!列表中還有幾個計劃中的新功能特性在考察和開發階段,我會對用戶提出的新功能需求進行合理性和必要性的評估,然後進行適當的取捨,因此計劃中的功能特性列表可能會隨時發生變化。另外,也歡迎對 gnet 源碼感興趣且想爲 gnet 增添新功能或者修復 bug 的同學給我提 PR 貢獻代碼,謝謝!

gnet 的自我定位是高性能且輕量級的 Go 語言網絡框架,暴露極簡的接口的同時又能提供豐富的功能,性能遠超 Go 語言原生網絡庫,如果你的追求極致的性能,那 gnet 絕對是你的絕佳選擇。

性能測試

上面提到 gnet 作爲一個 Go 語言網絡框架主打的是高性能,當然,不能只憑我一張嘴說說就證明了 gnet 的高性能,畢竟空口無憑嘛!所以,在這裏讓我引用改編一下程序員撕逼界著名的一句話:Talk is cheap, show me your benchmark!

提到框架性能測試,熟悉這方面的同學不會沒聽過 TechEmpower,這是全球 Web 框架權威性能測試:

This is a performance comparison of many Web application frameworks executing fundamental tasks such as JSON serialization, database access, and server-side template composition. Each framework is operating in a realistic production configuration. Results are captured on cloud instances and on physical hardware. The test implementations are largely community-contributed and all source is available at the GitHub repository.

TechEmpower 測試有源代碼,硬件配置全部公開,而且很多框架是作者自己或資深愛好者提交的,他們各自肯定知道該如何極致地優化基於這些框架的 Server,而且這些結果都是可重現的,誰覺得不服可以自己跑跑看,源代碼和需求頁面提供了每種測試的執行細節以及其它相關信息,各種 Web 框架性能對比頁面提供了更多有關如何進行測試的細節與測試基準的概況。TechEmpower 測試的主要目的是將目前流行的 Web 開發框架從多個維度來進行測試,這些測試的場景主要是針對這些 Web 框架執行的基本任務,比如數據庫訪問、JSON 序列化和服務端模板的組合等等場景,整體得分非常具有借鑑價值。

目前已提交 TechEmpower 測試的框架有將近 700 個,其中包括 Netty、Vert.x、Spring、Actix、FastHTTP、Swoole、Nginx 等業界知名的框架/平臺,囊括了 C/C++、Java、C#、Rust、Go、PHP、Ruby、Python 等一衆主流編程語言,是目前業界最權威的 Web 框架性能測試。

目前,TechEmpower 提供了 2 種硬件環境:雲主機 Microsoft Azure D3v2 instances; switched gigabit Ethernet 和物理機 Dell R440 servers each equipped with an Intel Xeon Gold 5120 CPU, 32 GB of memory, and an enterprise SSD. Dedicated Cisco 10-gigabit Ethernet switch。

測試內容包括 Plaintext、Single Database Query、Multiple Database Queries、Fortunes、JSON Serialization 等等(全部的測試 cases 可以查看 Project Information Framework Tests Overview),得出了一系列的 Web 框架的性能基準,對於程序員來說,這是一份極具參考價值的 Web 框架評估選型的 benchmark 數據。

gnet 的性能數據將藉助於 TechEmpower 展現,由於 TechEmpower 的測試是基於 HTTP 協議的,因此需要基於 gnet 實現一個簡單的 HTTP Server 並提交 TechEmpower 測試,目前 gnet 參與測試的只有 Plaintext 這一項,這也是最能直接體現出框架網絡處理性能的一項測試。

下面是最新一輪的 TechEmpower Benchmark 性能測試結果:

# Hardware
CPU: 28 HT Cores Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz
Mem: 32GB RAM
OS : Ubuntu 18.04.3 4.15.0-88-generic #88-Ubuntu
Net: Switched 10-gigabit ethernet
Go : go1.14.x linux/amd64

所有語言框架

這是包含全部編程語言框架的性能排名 top 50 的結果,總榜單包含了全世界共計 382 個框架(Plaintext 測試), gnet 位列第 5, gnet 也是唯一進入前十的 Go 語言框架。其中,一些業界比較知名的框架/平臺的排名:Netty 排名 36、Nginx 排名 66、Vert.x 排名 40、Spring 排名 238,等等。

Go 語言框架

這是 Go 語言分類下的性能排名, gnet 位列第 1。

完整的排行可以通過 view all benchmark results 查看。

基於上面的 TechEmpower 性能測試結果, gnet 在全世界的框架/平臺的競爭中名列第 5,中二點說法就是天下第五,它的高性能定位應該可以說是毋庸置疑了。

P.S. 需要說明的是,因爲 gnet 並不是一個 Web/HTTP 框架而是一個更加底層的網絡框架,所以我給 gnet 裸寫了一個簡單的 HTTP Parser,其對於 HTTP 協議的解析是不完備的,跳過了一些(對於這個測試不需要的)繁雜解析步驟,可以說是針對性的優化。相較於其他真正的 Web/HTTP 框架, gnet 在這方面佔了一點便宜,不過,Plaintext Benchmarks 主要測試的是框架最基礎/核心request-routing 性能,所以最終的測試結果對於評估一個框架的網絡處理性能還是極具參考價值和現實意義的。

總結

gnet 作爲一個高性能且輕量級的網絡框架,適用於追求極致性能的網絡場景,性能表現遠超 Go 語言原生網絡庫,就算是在全球權威性能測試 TechEmpower 排行榜上的表現也很耀眼:全部編程語言總排行第 5,Go 語言分類排行第 1。如果你正在用 Go 開發網絡應用且追求極致的性能, gnet 將會是你的絕佳選擇,歡迎試用!

開源地址:https://github.com/panjf2000/gnet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章