Golang Go语言中100w websocket 链接占用 550-760MB 内存的 greatws 来了-beta 版

发布于 1周前 作者 yibo5220 来自 Go语言

greatws

支持海量连接的 websocket 库,callback 写法

项目地址

https://github.com/antlabs/greatws

Go codecov Go Report Card

处理流程

greatws.png

特性

  • 支持 epoll/kqueue
  • 低内存占用
  • 高 tps

暂不支持

  • ssl
  • windows
  • io-uring

警告⚠️

早期阶段,暂时不建议生产使用

例子-服务端


type echoHandler struct{}

func (e *echoHandler) OnOpen(c *greatws.Conn) { // fmt.Printf(“OnOpen: %p\n”, c) }

func (e *echoHandler) OnMessage(c greatws.Conn, op greatws.Opcode, msg []byte) { if err := c.WriteTimeout(op, msg, 3time.Second); err != nil { fmt.Println(“write fail:”, err) } // if err := c.WriteMessage(op, msg); err != nil { // slog.Error(“write fail:”, err) // } }

func (e *echoHandler) OnClose(c *greatws.Conn, err error) { errMsg := “” if err != nil { errMsg = err.Error() } slog.Error(“OnClose:”, errMsg) }

type handler struct { m *greatws.MultiEventLoop }

func (h *handler) echo(w http.ResponseWriter, r http.Request) { c, err := greatws.Upgrade(w, r, greatws.WithServerReplyPing(), // greatws.WithServerDecompression(), greatws.WithServerIgnorePong(), greatws.WithServerCallback(&echoHandler{}), // greatws.WithServerEnableUTF8Check(), greatws.WithServerReadTimeout(5time.Second), greatws.WithServerMultiEventLoop(h.m), ) if err != nil { slog.Error(“Upgrade fail:”, “err”, err.Error()) } _ = c }

func main() {

var h handler

h.m = greatws.NewMultiEventLoopMust(greatws.WithEventLoops(0), greatws.WithMaxEventNum(256), greatws.WithLogLevel(slog.LevelError)) // epoll, kqueue
h.m.Start()
fmt.Printf("apiname:%s\n", h.m.GetApiName())

mux := &http.ServeMux{}
mux.HandleFunc("/autobahn", h.echo)

rawTCP, err := net.Listen("tcp", ":9001")
if err != nil {
	fmt.Println("Listen fail:", err)
	return
}
log.Println("non-tls server exit:", http.Serve(rawTCP, mux))

}

100w websocket 长链接测试

e5 洋垃圾机器

  • cpu=e5 2686(单路)
  • memory=32GB
BenchType  : BenchEcho
Framework  : greatws
TPS        : 27954
EER        : 225.42
Min        : 35.05us
Avg        : 1.79s
Max        : 2.74s
TP50       : 1.88s
TP75       : 1.95s
TP90       : 1.99s
TP95       : 2.02s
TP99       : 2.09s
Used       : 178.86s
Total      : 5000000
Success    : 5000000
Failed     : 0
Conns      : 1000000
Concurrency: 50000
Payload    : 1024
CPU Min    : 41.62%
CPU Avg    : 124.01%
CPU Max    : 262.72%
MEM Min    : 555.25M
MEM Avg    : 562.44M
MEM Max    : 626.47M

5800h cpu

  • cpu=5800h
  • memory=64GB
BenchType  : BenchEcho
Framework  : greatws
TPS        : 82088
EER        : 447.72
Min        : -1ns
Avg        : 605.25ms
Max        : 1.68s
TP50       : 609.79ms
TP75       : 709.26ms
TP90       : 761.86ms
TP95       : 771.77ms
TP99       : 779.10ms
Used       : 50.47s
Total      : 5000000
Success    : 4142842
Failed     : 857158
Conns      : 1000000
Concurrency: 50000
Payload    : 1024
CPU Min    : 114.33%
CPU Avg    : 183.35%
CPU Max    : 280.22%
MEM Min    : 625.27M
MEM Avg    : 632.89M
MEM Max    : 666.96M

Golang Go语言中100w websocket 链接占用 550-760MB 内存的 greatws 来了-beta 版

更多关于Golang Go语言中100w websocket 链接占用 550-760MB 内存的 greatws 来了-beta 版的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

(⊙﹏⊙)

更多关于Golang Go语言中100w websocket 链接占用 550-760MB 内存的 greatws 来了-beta 版的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


OP 我们一直在卷 golang ws 这些,欢迎各位来试试:
github.com/lesismal/go-websocket-benchmark

针对帖子中提到的“Golang Go语言中100w websocket链接占用550-760MB内存的greatws beta版”,作为IT领域Go语言方面的专家,我认为这一成果在WebSocket内存管理方面表现出色。以下是我的专业回复:

首先,处理100万个WebSocket连接本身就是一个巨大的挑战,因为这需要服务器具备强大的并发处理能力和内存管理能力。greatws beta版能够在这样的连接数量下保持较低的内存占用,确实令人印象深刻。

其次,550-760MB的内存占用范围对于如此大规模的WebSocket连接来说,是非常高效的。这得益于greatws在内存管理方面的优化,例如可能采用了对象池、内存复用等技术来减少内存分配和垃圾回收的开销。

最后,值得注意的是,beta版通常意味着软件还在测试阶段,可能还存在一些未知的问题或漏洞。因此,在正式部署之前,建议进行充分的测试,以确保软件的稳定性和可靠性。

总之,greatws beta版在WebSocket内存管理方面表现出色,为Go语言在高性能、高并发场景下的应用提供了有力的支持。期待它在未来的发展中能够持续优化,为开发者带来更好的体验。

回到顶部