Golang WebSocket 性能测试与基准对比

Golang WebSocket 性能测试与基准对比 GitHub - lesismal/go-websocket-benchmark

为 lesismal/go-websocket-benchmark 的开发做出贡献,请在 GitHub 上创建一个账户。

| Framework        | TPS    | Min     | Avg     | Max      | TP50    | TP75    | TP90    | TP95    | TP99    | Used   | Total   | Success | Failed | Conns | Concurrency | Payload | CPU Min | CPU Avg | CPU Max | MEM Min | MEM Avg | MEM Max |
| ---------------- | ------ | ------- | ------- | -------- | ------- | ------- | ------- | ------- | ------- | ------ | ------- | ------- | ------ | ----- | ----------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |
| fasthttp         | 236472 | 14.02us | 21.12ms | 112.12ms | 20.32ms | 26.06ms | 33.34ms | 39.00ms | 51.30ms | 8.46s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 125.93  | 269.62  | 303.97  | 111.38M | 116.93M | 122.50M |
| gobwas           | 199529 | 21.48us | 25.02ms | 171.70ms | 23.64ms | 30.03ms | 38.51ms | 44.72ms | 64.60ms | 10.02s | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 0.00    | 303.06  | 356.25  | 48.86M  | 49.51M  | 49.88M  |
| gorilla          | 235585 | 15.65us | 21.19ms | 142.65ms | 20.22ms | 26.07ms | 33.67ms | 39.37ms | 53.48ms | 8.49s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 142.93  | 269.33  | 297.96  | 110.09M | 115.75M | 121.29M |
| gws              | 241793 | 13.16us | 20.64ms | 115.26ms | 19.82ms | 25.33ms | 32.73ms | 38.26ms | 50.39ms | 8.27s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 74.87   | 250.86  | 290.97  | 83.86M  | 86.33M  | 87.98M  |
| gws_std          | 243138 | 12.68us | 20.51ms | 123.45ms | 19.75ms | 25.50ms | 32.88ms | 37.94ms | 50.84ms | 8.23s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 43.93   | 256.14  | 296.10  | 140.76M | 157.20M | 168.02M |
| hertz            | 216575 | 17.75us | 23.04ms | 113.47ms | 22.07ms | 28.39ms | 36.19ms | 42.69ms | 56.46ms | 9.23s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 68.91   | 302.87  | 340.26  | 248.04M | 293.02M | 314.79M |
| hertz_std        | 227549 | 13.40us | 21.94ms | 180.43ms | 20.56ms | 27.23ms | 35.96ms | 41.77ms | 56.44ms | 8.79s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 0.00    | 261.08  | 311.95  | 153.61M | 159.75M | 165.70M |
| nbio_blocking    | 234597 | 13.62us | 21.27ms | 160.83ms | 19.90ms | 26.51ms | 34.55ms | 40.26ms | 54.00ms | 8.53s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 154.81  | 283.82  | 317.98  | 90.73M  | 105.22M | 118.71M |
| nbio_mixed       | 235479 | 13.00us | 21.20ms | 113.62ms | 20.17ms | 26.08ms | 34.30ms | 40.39ms | 51.54ms | 8.49s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 141.91  | 279.44  | 311.49  | 99.27M  | 149.77M | 200.90M |
| nbio_nonblocking | 207926 | 69.18us | 24.00ms | 107.70ms | 23.06ms | 29.91ms | 36.99ms | 41.84ms | 53.31ms | 9.62s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 190.95  | 305.77  | 327.70  | 72.79M  | 75.87M  | 77.86M  |
| nbio_std         | 241856 | 15.67us | 20.64ms | 123.82ms | 19.76ms | 25.68ms | 33.21ms | 38.73ms | 49.25ms | 8.27s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 73.88   | 267.60  | 305.96  | 99.43M  | 114.62M | 134.80M |
| nettyws          | 226121 | 15.42us | 22.06ms | 116.44ms | 21.11ms | 27.39ms | 34.99ms | 40.22ms | 52.32ms | 8.84s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 0.00    | 293.07  | 346.96  | 145.62M | 152.54M | 156.08M |
| nhooyr           | 217452 | 23.78us | 22.96ms | 113.03ms | 22.24ms | 28.04ms | 35.54ms | 41.20ms | 54.64ms | 9.20s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 512     | 66.97   | 346.47  | 385.94  | 173.53M | 179.44M | 188.95M |


| Framework        | TPS    | Min      | Avg     | Max      | TP50    | TP75    | TP90    | TP95     | TP99     | Used   | Total   | Success | Failed | Conns | Concurrency | Payload | CPU Min | CPU Avg | CPU Max | MEM Min | MEM Avg | MEM Max |
| ---------------- | ------ | -------- | ------- | -------- | ------- | ------- | ------- | -------- | -------- | ------ | ------- | ------- | ------ | ----- | ----------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |
| fasthttp         | 219910 | 14.13us  | 22.70ms | 133.49ms | 21.68ms | 28.05ms | 36.37ms | 42.26ms  | 55.82ms  | 9.09s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 16.97   | 249.69  | 284.96  | 135.38M | 135.57M | 135.81M |
| gobwas           | 142450 | 24.47us  | 35.00ms | 283.65ms | 28.77ms | 38.44ms | 78.43ms | 103.05ms | 134.12ms | 14.04s | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 1.00    | 330.44  | 367.95  | 48.84M  | 49.91M  | 55.29M  |
| gorilla          | 221218 | 14.70us  | 22.55ms | 179.01ms | 21.83ms | 27.99ms | 36.03ms | 41.36ms  | 53.67ms  | 9.04s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 5.99    | 248.05  | 280.96  | 134.41M | 136.59M | 141.50M |
| gws              | 228484 | 12.73us  | 21.85ms | 160.32ms | 20.83ms | 27.17ms | 34.86ms | 41.20ms  | 54.82ms  | 8.75s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 0.00    | 228.14  | 271.96  | 84.61M  | 89.45M  | 91.14M  |
| gws_std          | 227729 | 14.10us  | 21.92ms | 158.07ms | 20.94ms | 26.92ms | 35.07ms | 41.28ms  | 55.22ms  | 8.78s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 0.00    | 235.33  | 275.87  | 169.55M | 171.91M | 174.72M |
| hertz            | 202032 | 13.27us  | 24.69ms | 128.74ms | 23.41ms | 30.35ms | 38.93ms | 45.57ms  | 58.91ms  | 9.90s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 0.00    | 296.02  | 342.96  | 349.86M | 359.12M | 360.79M |
| hertz_std        | 215185 | 14.51us  | 23.15ms | 149.69ms | 21.98ms | 28.64ms | 37.44ms | 43.37ms  | 57.93ms  | 9.29s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 76.95   | 267.00  | 293.96  | 179.30M | 185.15M | 190.93M |
| nbio_blocking    | 217158 | 14.55us  | 22.99ms | 146.29ms | 21.92ms | 28.68ms | 36.84ms | 43.07ms  | 56.70ms  | 9.21s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 40.96   | 267.00  | 303.77  | 120.46M | 123.49M | 125.66M |
| nbio_mixed       | 218090 | 14.34us  | 22.86ms | 138.47ms | 21.67ms | 28.38ms | 36.76ms | 42.56ms  | 58.88ms  | 9.17s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 42.98   | 267.07  | 300.11  | 201.61M | 204.82M | 220.39M |
| nbio_nonblocking | 188382 | 113.59us | 26.50ms | 126.05ms | 25.47ms | 32.95ms | 40.74ms | 46.33ms  | 59.59ms  | 10.62s | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 190.89  | 308.24  | 326.94  | 77.86M  | 80.86M  | 81.43M  |
| nbio_std         | 225617 | 14.77us  | 22.13ms | 122.04ms | 21.16ms | 27.52ms | 35.08ms | 41.07ms  | 55.20ms  | 8.86s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 0.00    | 252.19  | 300.96  | 114.61M | 118.23M | 121.56M |
| nettyws          | 210130 | 18.36us  | 23.76ms | 149.63ms | 22.71ms | 29.36ms | 37.53ms | 44.14ms  | 59.77ms  | 9.52s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 159.95  | 311.32  | 337.95  | 153.93M | 160.14M | 162.21M |
| nhooyr           | 204513 | 26.98us  | 24.39ms | 142.40ms | 23.27ms | 29.86ms | 38.24ms | 44.54ms  | 58.18ms  | 9.78s  | 2000000 | 2000000 | 0      | 5000  | 5000        | 1024    | 0.00    | 329.69  | 379.96  | 269.47M | 269.68M | 270.04M |


| Framework        | TPS    | Min      | Avg      | Max      | TP50     | TP75     | TP90     | TP95     | TP99     | Used   | Total   | Success | Failed | Conns | Concurrency | Payload | CPU Min | CPU Avg | CPU Max | MEM Min | MEM Avg | MEM Max |
| ---------------- | ------ | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | ------ | ------- | ------- | ------ | ----- | ----------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |
| fasthttp         | 226234 | 390.11us | 87.56ms  | 275.99ms | 85.11ms  | 103.56ms | 122.45ms | 137.31ms | 167.39ms | 8.84s  | 2000000 | 2000000 | 0      | 20000 | 20000       | 512     | 0.00    | 299.70  | 371.34  | 421.14M | 427.36M | 433.19M |
| gobwas           | 188786 | 227.74us | 105.23ms | 278.84ms | 102.37ms | 119.74ms | 139.30ms | 154.06ms | 188.77ms |

更多关于Golang WebSocket 性能测试与基准对比的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang WebSocket 性能测试与基准对比的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据提供的基准测试数据,lesismal/go-websocket-benchmark 项目对多个Go语言WebSocket框架进行了性能对比。从512字节和1024字节负载的测试结果来看,不同框架在TPS(每秒事务数)、延迟和资源消耗方面存在显著差异。

在512字节负载下,gws_std框架表现最佳,TPS达到243,138,平均延迟为20.51ms,内存使用相对较低(平均157.20M)。gws框架紧随其后,TPS为241,793。nbio_stdfasthttp也表现出色,TPS均超过236,000。

当负载增加到1024字节时,gws框架以228,484 TPS领先,平均延迟21.85ms。gws_stdnbio_std分别以227,729 TPS和225,617 TPS位列其后。值得注意的是,gobwas框架在较大负载下性能下降明显,TPS从199,529降至142,450。

从资源消耗角度看,gobwas框架内存使用最低(平均49.51M-49.91M),但CPU使用率较高。hertz框架内存消耗最大,达到293.02M-359.12M。

以下是使用gws框架的简单示例代码:

package main

import (
    "log"
    "net/http"
    "github.com/hwholiday/learning_tools/websocket/gws"
)

func main() {
    upgrader := gws.NewUpgrader(&Handler{}, &gws.ServerOption{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
    })
    
    http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r)
        if err != nil {
            log.Println("Upgrade error:", err)
            return
        }
        go conn.ReadLoop()
    })
    
    log.Fatal(http.ListenAndServe(":8080", nil))
}

type Handler struct{}

func (h *Handler) OnOpen(socket *gws.Conn) {
    log.Println("Connection opened")
}

func (h *Handler) OnClose(socket *gws.Conn, err error) {
    log.Println("Connection closed")
}

func (h *Handler) OnPing(socket *gws.Conn, payload []byte) {
    socket.WritePong(payload)
}

func (h *Handler) OnPong(socket *gws.Conn, payload []byte) {}

func (h *Handler) OnMessage(socket *gws.Conn, message *gws.Message) {
    defer message.Close()
    socket.WriteMessage(message.Opcode, message.Bytes())
}

对于需要高并发WebSocket服务的场景,建议根据具体需求选择框架:gws系列在性能上表现突出,gobwas在内存使用上有优势,nbio系列提供了多种I/O模型选择。实际选择时需综合考虑性能指标、API易用性和项目维护状态。

回到顶部