V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guonaihong
V2EX  ›  Go 编程语言

100w websocket 链接占用 550-760MB 内存的 greatws 来了-beta 版

  •  
  •   guonaihong ·
    guonaihong · 69 天前 · 1760 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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, 3*time.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(5*time.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
    
    8 条回复    2024-02-18 18:11:01 +08:00
    kkk9
        1
    kkk9  
       69 天前
    (⊙﹏⊙)
    godymho
        2
    godymho  
       69 天前
    (⊙﹏⊙)
    oneisall8955
        3
    oneisall8955  
       69 天前 via Android
    (⊙﹏⊙)
    juzisang
        4
    juzisang  
       69 天前
    (⊙﹏⊙)
    wangx0102
        5
    wangx0102  
       69 天前
    (⊙﹏⊙)
    ldyisbest
        6
    ldyisbest  
       69 天前
    (⊙﹏⊙)
    lesismal
        7
    lesismal  
       69 天前   ❤️ 1
    OP 我们一直在卷 golang ws 这些,欢迎各位来试试:
    github.com/lesismal/go-websocket-benchmark
    guo4224
        8
    guo4224  
       69 天前
    (⊙﹏⊙)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   877 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:43 · PVG 05:43 · LAX 14:43 · JFK 17:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.