golang 的哪个 websocket 好用?

2023-02-25 16:48:54 +08:00
 dw2693734d

gorilla 已经不维护了

8497 次点击
所在节点    Go 编程语言
62 条回复
Nazz
2023-02-26 13:33:34 +08:00
@lesismal 对 channel 使用不熟悉也很容易死锁
Nazz
2023-02-26 14:41:07 +08:00
@lesismal 用普罗米修斯监控确实影响了测试 RPS, 同样的命令, 去掉监控后跑到了 8000Mbps, 加上监控只有 4400Mbps.
但是我那个测试项目里面, gws 和 nbio 运行条件都是一样的
gws 同步读同步写: Aggregate bandwidth: 4384.217↓, 4381.833↑ Mbps
nbio 阻塞模式: Aggregate bandwidth: 2558.850↓, 2471.334↑ Mbps
命令: tcpkali -c 1000 --connect-rate 500 -r 2000 -T 3000s -f assets/1K.txt --ws 127.0.0.1:${port}/connect
lesismal
2023-02-26 15:26:12 +08:00
@Nazz #42
我刚跑了下 tcpkali ,按照你的参数确实 gws 更快,但是我本地得到的数据差异没那么大。
netstat 查了下,tcp 收发缓冲区待读写的 size 较大、远超过单个包 size ,加上 tcpkali 的-r 参数你设置的 500 (每秒向每个连接发送 500 个包),这说明 tcpkali 压测方式是不管对方是否回包,都会按照-r 这个频率往对方发包。

nbio 的解析器是异步流解析器,在-r 500 这种测试情况下,相比于 gws 的同步读同步解析,nbio 要处理更多的包边界、半包缓存之类的,所以会不划算。但实际场景中单个连接 client 向 server 每秒 500 个包是不太可能的、fps 类也远低于此。server 端推送也不会有这么高的频率。如果是有人来攻击 server 、这个连接响应慢了也不怕。

1000 连接这种,如果把-r 调整到正常交互频率,性能就都差不多了。

我又尝试把-r 20 、连接数提高到 2w ,nbio 的数据会更好些:
tcpkali -c 20000 --connect-rate 5000 -r 20 -T 30s -f ./1K.txt --ws 127.0.0.1:28001/ws
2w 连接 gws 遇到过一次不知道是不是触发了 bug ,2w 在线、协程数却达到了 3w+,tcpkali 30 秒竟然也没返回,不知道是不是 tcpkali 测试 bug 导致不断有新连接才导致 gws 协程 3w+,忘记了保存现场、后面多跑了几轮没再遇到,所以暂时没法分析这个了

更大连接数用 tcpkali 不太好测了,多个节点一是卡、二是建立连接的时段不一样,有的节点建立连接后就开始猛发数据把 server 打满了,新节点再进入就困难了。但一些海量连接的业务的话可能是连接数多但频率没这么高所以新连接进来速度也还好。
这也是为什么我之前没用第三方的工具进行百万链接的测试、而是自己写 client 来测试的原因:
https://github.com/lesismal/nbio-examples/blob/master/websocket_1m/client/client.go

tinyws 在-r 500 的情况下跟 nbio 差不多可能略慢,我没看 tinyws 的代码、暂时没有分析慢的原因
lesismal
2023-02-26 15:28:13 +08:00
> 用普罗米修斯监控确实影响了测试 RPS, 同样的命令, 去掉监控后跑到了 8000Mbps, 加上监控只有 4400Mbps.

@Nazz
对,额外的重量级工具本身带来的消耗影响大,而且他们的消耗也不是平均持续稳定的、没法保障对不同框架测试时段的环境公平性,所以大家做压测通常不使用这些
lesismal
2023-02-26 15:37:21 +08:00
@Nazz
我能想到的高频发包的场景,比如 RPC ,但是 RPC 通常内网,TCP 更具优势(所以我非常抵制 GRPC ),而且 RPC 服务承载的 client 连接数并不会特别大,所以基于标准库同步方案、同步解析就 ok 了,我的 arpc 也是这样。但是 arpc 也支持 web 前端 client 直接通过 http/websocket 交互,这时候虽然可能连接数量也很大,但是这种用户并不是服务之间的 RPC 调用、所以也不会有服务之间 RPC 那种单个连接高频发包的场景、真有攻击的话它自己这个连接慢了也活该。。。

我暂时没看懂 tcpkali 有没有办法进行类似 echo 测试这种,发-收-发-收,这样即使连接数不是特别大也可以把 server 性能跑满、更符合实际场景一些,而不是像上面那样通过-r 超过正常需求范围的情况下打满
Nazz
2023-02-26 16:11:37 +08:00
@lesismal iops 较低的情况下,gorilla, gws, nbio 性能都够用了,上限越高说明库本身的开销越小
Nazz
2023-02-26 16:34:42 +08:00
@lesismal 没有任何业务负载的情况下,gws 的性能上限是每秒收发各 100w+个 1KB 的 websocket frame ,可以看到上下行带宽是对等的
lesismal
2023-02-26 17:49:51 +08:00
@Nazz #46
不同的参数下,跑出来的数据是不一样的。 -r 500 这种,在正常的服务里限流机制直接就把它 close 了的。
不同连接数、包体、 -r 取正常值范围的情况下,你可以试一下看看各个框架带宽和消耗能跑到多少,我环境下得到的数据并不是哪个固定第一,cpu 占用有差别,有的 cpu 高一些但是同样获得了更高的吞吐,有的 cpu 利用率上不去、跑多轮也还是低消耗低带宽比较奇怪。框架数量太多参数太多,跑几轮下来我眼睛都花了

不能只以一种参数来确定性能
Nazz
2023-02-26 19:30:24 +08:00
@lesismal 控制下变量就很好对比性能了, 同样的网络库, 连接数和 IOPS 下, 对比延迟分布, 延迟百分位和 CPU 内存占用. nbio 我最佩服的是手搓 tls, 那玩意一看就不简单.
lesismal
2023-02-26 19:52:48 +08:00
@Nazz
对,得多弄点不同变量参数对比,鸟窝老师 rpc 的测试里不同参数对比就相对全面一些

tls 直接标准库 copy 一份魔改的,难度倒是不大,主要是琐碎,debug 、覆盖比较烦躁
lesismal
2023-02-26 20:00:11 +08:00
@Nazz
好些个开源的 IM 项目用的都是基于标准库同步 io 的 conn ,真要是在线量大,他们那个服务器节点数量成本会很高,如果换 nbio ,估计能省掉至少三分之二硬件成本,集群内部通信用的 GRPC 如果换成 arpc 走 tcp 、性能又能提高不少。
nbio 最初的定位是解决 1m-connection ,几个月前还都不支持多 io 模式的,一般在线量的场景,纯 poller 的响应性能跟基于标准库的相比实在是没得比,现在平衡多了

其实如果放到量大的业务上做基础设施,都能省很多成本。但如果真的量巨大,公司有钱,还是 rust 或者 c/cpp 好些。前阵子 cloudflare 说他们内部的 rust proxy 性能相当好

go 版本的这些,跟 rust/c/cpp 的相比,实在是撵不上了,如果还年轻,我就去玩 rust 了,但是年纪不小,玩不动了
lesismal
2023-02-26 20:03:05 +08:00
@Nazz #32
我最早的时候是看到 evio ,国人又有人改进写了 gev 和 gnet ,想直接用他们的,但是功能太少了,只能用于 4 层,7 层自定义协议,tls/http/ws 这些统统没有,而且 gnet 性能略好于 gev ,但是没有实现 net.Conn ,想基于它封装也是非常麻烦,所以放弃了,自己撸着玩,慢慢就把功能加得越来越多了
Nazz
2023-02-26 21:19:59 +08:00
@lesismal 我本来想学 rust 刷题玩玩,直接劝退了,写点数据结构太劳心了.
Nazz
2023-02-26 21:24:18 +08:00
@lesismal 不看好 rust ,门槛决定了小众,底层开发才会考虑.
lesismal
2023-02-26 23:27:58 +08:00
@Nazz c/cpp/rust 掌控力强,我就最喜欢 c void*,无拘无束,go 虽然写着省力写的快挺爽,但是找不到那种尽情优化做到极致控场的感觉,虽然爽但爽不到极致,只是均衡的感觉
Nazz
2023-02-26 23:42:30 +08:00
@lesismal c/cpp 自由,rust 是被编译器教做人
lesismal
2023-02-27 14:59:30 +08:00
@Nazz
我是真有点想搞 rust 了:
mp.weixin.qq.com/s/1dB4P54tVz-aM2iYIkE4fg
Nazz
2023-02-27 16:51:08 +08:00
@lesismal 时间充裕就学起来吧
pushy
2023-02-27 18:44:18 +08:00
dw2693734d
2023-03-02 12:28:59 +08:00
@Nazz 被编译器教做人, 哈哈,笑死

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919140

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX