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
更多关于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_std和fasthttp也表现出色,TPS均超过236,000。
当负载增加到1024字节时,gws框架以228,484 TPS领先,平均延迟21.85ms。gws_std和nbio_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易用性和项目维护状态。

