https://github.com/Allenxuxu/gev
本文主要测试 gev 网络库和其他三方 Go 网络库以及标准库的吞吐量对比。
采用陈硕测试 muduo 使用的 ping pong 协议来测试吞吐量。
简单地说,ping pong 协议是客户端和服务器都实现 echo 协议。当 TCP 连接建立时,客户端向服务器发送一些数据,服务器会 echo 回这些数据,然后客户端再 echo 回服务器。这些数据就会像乒乓球一样在客户端和服务器之间来回传送,直到有一方断开连接为止。这是用来测试吞吐量的常用办法。
测试的客户端代码: https://github.com/Allenxuxu/gev/blob/master/benchmarks/client/main.go
测试脚本: https://github.com/Allenxuxu/gev/blob/master/benchmarks/bench-pingpong.sh
主要做两项测试:
所有测试中,ping pong 消息的大小均为 4096 bytes,客户端始终是 4 线程运行。
无论是单线程,还是多线程模式下,gev 都比其他网络库吞吐量略高出一些。
evio 因为 epoll 使用一些 bug 和可优化之处,所以在 linux 环境中的吞吐量远不如优化版本 eviop。
eviop 是我对 evio bug 修复和优化的版本,所以其性能也是比 evio 提升不少。我曾尝试在 eviop 中替换 evio 的网络模型( evio 利用 accpet 的惊群现象工作),但是因为其代码耦合度过高,修改成本过大,最终决定一边完善 eviop (维持网络模型不变)一边自己借鉴 muduo 的网络模型重新撸一个新的 -- gev。
gnet 是研究了 eviop 的代码,继续在其之上替换网络模型的版本。但是网络模型的优势在单线程模式中并没有体现出来,吞吐量反而比 eviop 小一些。在多线程模式下,网络模型的优势得以体现。
gev 与其他使用 epoll 构建的基于事件驱动的网络库在逐步的优化中,相信性能都差不多。因为作者目的不同,网络库不同的设计,优势点都会不同。我研究 evio,最终自己撸了 gev,也是因为想要一个在内存占用低前提下,速度足够快,能负载更多连接的网络库。
如果对 gev 网络库感兴趣,欢迎提意见和 PR。➡️ https://github.com/Allenxuxu/gev
1
KgM4gLtF0shViDH3 2019-09-22 20:46:23 +08:00 via iPhone
学习学习,正好需要,嘿嘿
|
2
iPhoneXI 2019-09-22 21:02:15 +08:00 via Android 2
加一下英文文档,发到 hackernews/medium/reddit 上,传播效果应该更好
|
3
reus 2019-09-22 21:02:41 +08:00 1
https://godoc.org/io#Reader
你处理 io.Reader.Read 的返回有问题,即使返回的 error 非 nil,返回的 int 也可能大于 0,要先处理大于零的情况,再检查错误 |
4
BBCCBB 2019-09-22 21:10:12 +08:00
Go 开放 poll 接口了吗??
|
5
cabing 2019-09-22 21:14:51 +08:00
必须 star。
写个开源的库好难的。特别是对于 996 的程序员们。。 |
6
bxtx999 2019-09-22 21:14:54 +08:00
很赞,收藏研究下!
|
7
reus 2019-09-22 21:17:43 +08:00
@BBCCBB epoll 之类是系统调用,直接用就行,没什么开放不开放的说法,从来都不阻止你用: https://godoc.org/syscall#EpollCreate
|
12
Foreverdxa 2019-09-22 22:21:34 +08:00
star =我完全了解了...(_)
|
13
xuxu555 OP @Foreverdxa 不不不,star 就是学会 ,fork 就是我要你! [手动坏笑]
|
14
firefox12 2019-09-23 08:05:23 +08:00
回退到 c++ 时代的设计思想了,性能是好了,但是心智负担加重了,go 的优势没有了。 不知道复杂的业务场景处理起来会怎么样。比如创建 50 万个连接,代码编写会变成怎么样。
|
15
wolfish 2019-09-23 09:08:58 +08:00 via Android
先 star,正好后面研究
|
16
guonaihong 2019-09-23 13:29:33 +08:00
可有和 http 1.1 和 http 2.0 对比 benchmark ?
|