很多普通开发者, 甚至库的作者, 没有意识到 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 slowman 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 |