专栏首页编程札记最快的 Go 网络框架 gnet 来啦!

最快的 Go 网络框架 gnet 来啦!

gnet 是什么?

gnet是一个基于事件驱动的高性能且轻量级的网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv。

gnet 设计开发的初衷不是为了取代 Go 的标准网络库:net,而是为了创造出一个类似于 Redis、Haproxy 能高效处理网络包的 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,随时到gnet的 Github Issue 页 给我提 issue。

「目前, gnet具备了如下的功能特性:」

  • [x] 高性能 的基于多线程/Go程网络模型的 event-loop 事件驱动
  • [x] 内置 goroutine 池,由开源库 ants 提供支持
  • [x] 内置 bytes 内存池,由开源库 bytebufferpool 提供支持
  • [x] 简洁的 APIs
  • [x] 基于 Ring-Buffer 的高效内存利用
  • [x] 支持多种网络协议/IPC 机制:TCP、UDP 和 Unix Domain Socket
  • [x] 支持多种负载均衡算法:Round-Robin(轮询)、Source Addr Hash(源地址哈希)和 Least-Connections(最少连接数)
  • [x] 支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
  • [x] 支持异步写操作
  • [x] 灵活的事件定时器
  • [x] SO_REUSEPORT 端口重用
  • [x] 内置多种编解码器,支持对 TCP 数据流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,参考自 netty codec,而且支持自定制编解码器
  • [x] 支持 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

References

[1] epoll: https://en.wikipedia.org/wiki/Epoll [2] kqueue: https://en.wikipedia.org/wiki/Kqueue [3] net: https://golang.org/pkg/net/ [4] netty: https://github.com/netty/netty [5] libuv: https://github.com/libuv/libuv [6] net: https://golang.org/pkg/net/ [7] Redis: http://redis.io [8] Haproxy: http://www.haproxy.org [9] Github Issue 页: https://github.com/panjf2000/gnet/issues [10] ants: https://github.com/panjf2000/ants [11] bytebufferpool: https://github.com/valyala/bytebufferpool [12] netty codec: https://netty.io/4.1/api/io/netty/handler/codec/package-summary.html [13] TechEmpower: https://www.techempower.com/benchmarks/ [14] GitHub repository: https://github.com/TechEmpower/FrameworkBenchmarks [15] 源代码和需求: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview [16] 各种 Web 框架性能对比: https://www.techempower.com/benchmarks/#section=test&runid=c7152e8f-5b33-4ae7-9e89-630af44bc8de&hw=ph&test=plaintext [17] Intel Xeon Gold 5120 CPU: https://ark.intel.com/products/120474/Intel-Xeon-Gold-5120-Processor-19_25M-Cache-2_20-GHz [18] Project Information Framework Tests Overview: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#test-types [19] view all benchmark results: https://www.techempower.com/benchmarks/#section=test&runid=b24568ff-8eb3-4e5a-816f-8284bd5ec89c&hw=ph&test=plaintext

本文分享自微信公众号 - 潘建锋(R136a1_Pan),作者:妖道

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gnet: 轻量级且高性能的 Golang 网络库

    gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll[1] 和 kqueue[2] 系统调用而非标准 Gola...

    潘少
  • 【开源】gnet: 一个轻量级且高性能的 Golang 网络库

    gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包...

    潘少
  • Linux I/O 原理和 Zero-copy 技术全面揭秘

    如今的网络应用早已从 CPU 密集型转向了 I/O 密集型,网络服务器大多是基于 C-S 模型,也即 客户端 - 服务端 模型,客户端需要和服务端进行大量的网络...

    潘少
  • LeetCode 26. 删除排序数组中的重复项

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    村雨遥
  • Mysql 主从复制日志参数优化

    MySQL的复制(Replication),实际上就是通过将Master端的Binlog利用IO线程通过网络复制到Slave端,然后再通过SQL线程解析Binl...

    dys
  • 【编程架构实战】——Java并发包基石-AQS详解

     Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共...

    Java知音
  • 【编程架构实战】——Java并发包基石-AQS详解

     Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共...

    Java知音
  • Adversarial Variational Bayes: 统一VAE和GAN 及代码

    Adversarial Variational Bayes: Unifying Variational Autoencoders and Generative ...

    用户1908973
  • Second Minimum Node In a Binary Tree

    Tyan
  • 「实战篇」开源项目docker化运维部署-源码介绍(二)

    PS:技术特点我都不做阐述了,重点是要把这个项目放入到docker虚拟机里面。这是最终的目的。

    IT故事会

扫码关注云+社区

领取腾讯云代金券