很多普通开发者, 甚至库的作者, 没有意识到 flate
算法内存占用过高的问题, 一个压缩器, 占用内存超过了 640KB !!!
package main
import (
"compress/flate"
"unsafe"
)
func main() {
writer, _ := flate.NewWriter(nil, flate.BestSpeed)
println(unsafe.Sizeof(*writer))
}
// output: 656648
我测试了一下三个 websocket package
, 10000 连接, 开启压缩, 10s 广播一次, 结果如下
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18563 caster 20 0 1340732 225504 4000 S 0.0 5.6 16:15.86 gws-linux-amd64
18542 caster 20 0 1469756 351172 4912 S 0.0 8.8 25:17.99 gorilla-linux-a
30294 caster 20 0 4791548 1.7g 880 S 0.0 44.6 0:07.33 nhooyr-linux-am
nhooyr
降低到开 5000 连接才能正常测试
1
raw0xff 2023-05-13 11:39:11 +08:00
求问这一万个连接是怎么测试的?虚拟机? docker ?什么工具?
|
2
Nazz OP @raw0xff 虚拟机, 工具是自己写的 https://go.dev/play/p/EUC4J0XY3Mr
|
3
Nazz OP @raw0xff 在这个库的基础上改了点代码 https://github.com/lxzan/wsbench
|
4
1423 2023-05-13 13:04:56 +08:00
websocket server 客户端直连?一般不是还有一个 http/https 网关吗,压缩放在网关上应该会有所不同?
或者 caddy 这种,给 http 开压缩也会有类似问题吗 |
5
lankunblue 2023-05-13 13:10:31 +08:00
@1423 同样好奇
|
6
Nazz OP |
8
Nazz OP @lankunblue websocket 压缩的问题比较突出,nhooyr 的内存占用是其他两个的 5-8 倍,gorilla 也有相关 issue ,不知道要怎么复现。
|
9
mikespook 2023-05-14 09:19:20 +08:00
这个应该算是一个老问题了 https://github.com/golang/go/issues/32371
|