欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

八种 WebSocket 框架的性能比较

发布时间:2025/3/21 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 八种 WebSocket 框架的性能比较 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前一篇文章使用四种框架分别实现百万websocket常连接的服务器介绍了四种websocket框架的测试方法和基本数据。 最近我又使用几个框架实现了websocket push服务器的原型,并专门对这七种实现做了测试。 本文记录了测试结果和一些对结果的分析。
这七种框架是:

  • Netty

  • Undertow

  • Jetty

  • Vert.x

  • Grizzly

  • spray-websocket

  • nodejs-websocket/Node.js

最近用Golang实现了第八种,Go表现还不错。

  • Go

1. 测试环境

使用三台C3.4xlarge AWS服务器做测试。 一台作为服务器,两台作为客户端机器, 每台客户端机器启动10个client,一共20个client
C3.4xlarge的配置如下:

型号vCPU内存 (GiB)SSD 存储 (GB)
c3.large23.752 x 16
c3.xlarge47.52 x 40
c3.2xlarge8152 x 80
c3.4xlarge16302 x 160
c3.8xlarge32602 x 320

服务器和客户端机器按照上一篇文章做了基本的优化。

以下是测试的配置数据:

  • 20 clients

  • setup rate设为500 * 20 requests/second = 10000 request /second

  • 每个client负责建立50000个websocket 连接

  • 等1,000,000个websocket建好好,发送一个消息(时间戳)给所有的客户端,客户端根据时间戳计算latency

  • 如果服务器setup rate建立很慢,主动停止测试

  • 监控三个阶段的性能指标: setup时, setup完成后应用发呆(idle)时,发送消息时

2. 测试结果

2.1 Netty

Setup时

  • cpu idle: 90%

  • minor gc: Few

  • full gc: No

Setup完成, 应用Idle时

  • cpu idle: 100%

  • memory usage: 1.68G

  • server free memory: 16.3G

发送消息时

  • cpu idle: 75%

  • minor gc: few

  • full gc: No

  • Message latency (one client)

         count = 50000min = 0max = 18301mean = 2446.09stddev = 3082.11median = 1214.0075% <= 3625.0095% <= 8855.0098% <= 12069.0099% <= 13274.0099.9% <= 18301.00

2.2 Vert.x

Setup时

  • cpu idle: 95%

  • minor gc: Few

  • full gc: No

Setup完成, 应用Idle时

  • cpu idle: 100%

  • memory usage: 6.37G

  • server free memory: 16.3G

发送消息时

  • cpu idle: 47% ~ 76%

  • minor gc: few

  • full gc: few

  • Message latency (one client)

         count = 50000min = 49max = 18949mean = 10427.00stddev = 5182.72median = 10856.0075% <= 14934.0095% <= 17949.0098% <= 18458.0099% <= 18658.0099.9% <= 18949.00

2.3 Undertow

Setup时

  • cpu idle: 90%

  • minor gc: Few

  • full gc: No

Setup完成, 应用Idle时

  • cpu idle: 100%

  • memory usage: 4.02G

  • server free memory: 14.2G

发送消息时

  • cpu idle: 65%

  • minor gc: few

  • full gc: No

  • Message latency

         count = 50000min = 1max = 11948mean = 1366.86stddev = 2007.77median = 412.0075% <= 2021.0095% <= 5838.0098% <= 7222.0099% <= 8051.0099.9% <= 11948.00

2.4 Jetty

Setup时

  • cpu idle: 2%

  • minor gc: Many

  • full gc: No

  • memory usage: 5G

  • server free memory: 17.2G

当建立360,000左右的websocket时, setup非常的慢, gc频繁,无法继续正常建立websocket, 主动终止测试。

2.5 Grizzly

Setup时

  • cpu idle: 20%

  • minor gc: Some

  • full gc: Some

  • memory usage: 11.5G

  • server free memory: 12.3G

当建立500,000左右的websocket时, setup非常的慢, gc频繁,无法继续正常建立websocket, 主动终止测试。

2.6 Spray

Setup时

  • cpu idle: 80%

  • minor gc: Many

  • full gc: No

当建立500,000左右的websocket时, setup非常的慢, gc频繁,无法继续正常建立websocket, 主动终止测试。

2.7 Node.js

Setup时

  • cpu idle: 94%

Setup完成, 应用Idle时

  • cpu idle: 100%

  • memory usage: 5.0G

  • server free memory: 16.3G

发送消息时

  • cpu idle: 94%

  • Message latency (one client)

  • Message latency

         count = 50000min = 0max = 18mean = 1.27stddev = 3.08median = 1.0075% <= 1.0095% <= 1.0098% <= 1.0099% <= 1.0099.9% <= 15.00

2.8 Go

Setup时

  • cpu idle: 94%

Setup完成, 应用Idle时

  • cpu idle: 100%

  • memory usage: 15G

  • server free memory: 6G

发送消息时

  • cpu idle: 94%

  • Message latency (one client)

  • Message latency

         count = 50000min = 0max = 35mean = 1.89stddev = 1.83median = 1.0075% <= 1.0095% <= 2.0098% <= 2.0099% <= 4.0099.9% <= 34.00

3. 测试结果分析

  • Netty, Go, Node.js, Undertow, Vert.x都能正常建立百万连接。 Jetty, Grizzly 和 Spray未能完成百万连接

  • Netty表现最好。内存占用非常的少, CPU使用率也不高。 尤其内存占用,远远小于其它框架

  • Jetty, Grizzly和Spray会产生大量的中间对象,导致垃圾回收频繁。Jetty表现最差

  • Node.js表现非常好。 尤其是测试中使用单实例单线程,建立速度非常快,消息的latency也很好。 内存占用也不错

  • Undertow表现也不错,内存占用比Netty高一些,其它差不多

  • 这里还未测到Spray另一个不好的地方。 在大量连接的情况小,即使没有消息发送,Spray也会占用40% CPU 时间

总结

以上是生活随笔为你收集整理的八种 WebSocket 框架的性能比较的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。