专栏首页芋道源码1024八种 WebSocket 框架的性能比较

八种 WebSocket 框架的性能比较

来源:http://t.cn/R94WxA1


1. 测试环境2. 测试结果2.1 Netty2.2 Vert.x2.3 Undertow2.4 Jetty2.5 Grizzly2.6 Spray2.7 Node.js2.8 Go3. 测试结果分析


前一篇文章使用四种框架分别实现百万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.large

2

3.75

2 x 16

c3.xlarge

4

7.5

2 x 40

c3.2xlarge

8

15

2 x 80

c3.4xlarge

16

30

2 x 160

c3.8xlarge

32

60

2 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 = 50000 min = 0 max = 18301 mean = 2446.09 stddev = 3082.11 median = 1214.00 75% <= 3625.00 95% <= 8855.00 98% <= 12069.00 99% <= 13274.00 99.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 = 50000 min = 49 max = 18949 mean = 10427.00 stddev = 5182.72 median = 10856.00 75% <= 14934.00 95% <= 17949.00 98% <= 18458.00 99% <= 18658.00 99.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 = 50000 min = 1 max = 11948 mean = 1366.86 stddev = 2007.77 median = 412.00 75% <= 2021.00 95% <= 5838.00 98% <= 7222.00 99% <= 8051.00 99.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 = 50000 min = 0 max = 18 mean = 1.27 stddev = 3.08 median = 1.00 75% <= 1.00 95% <= 1.00 98% <= 1.00 99% <= 1.00 99.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 = 50000 min = 0 max = 35 mean = 1.89 stddev = 1.83 median = 1.00 75% <= 1.00 95% <= 2.00 98% <= 2.00 99% <= 4.00 99.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 时间

本文分享自微信公众号 - 芋道源码(YunaiV)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • js如何操作本地程序

    假设有这样一个产品,一个web和一个winform客户端,在客户在web的网页上面点击启动客户端来处理,这个时候开始调用本地的客户端,来完成指定的工作。这种场景...

    付威
  • 杨老师课堂之JavaScript案例手动切换轮播图片

            2.1跳转div盒子的布局(宽、高、边框线、水平居中、文字居中...)

    杨校
  • JavaScript ES6 — 少即是多,以少胜多,四两拨千斤

    JavaScript ES6 brings new syntax and new awesome features to make your code more...

    一个会写诗的程序员
  • JSON.parse与JSON.stringify

    JSON:JavaScript Object Notation(JavaScript对象表示法);甚至我们就可以大致认为JSON就是Javascript的对象,...

    用户1149564
  • vue中样式的典型操作(:class,:style)

    用户1149564
  • 在未来五年中Python趋势,能否超过JavaScript成为第一语言?

    JavaScript和Python是两门非常有影响力的编程语言,二者都是我们在打造跨平台应用时会用到的主流语言。在过去的这些年中,尽管JavaScript始终占...

    一墨编程学习
  • js中数组常用逻辑算法(从大到小,从小到大排序,去重等问题)

    honey缘木鱼
  • Android关于Canvas你所知道的和不知道的一切

    Picture相当于先拍一张照片,并且是在别的Canvas上,在别的Canvas上,在别的Canvas上! 重要的话说三遍:当需要的时候在贴在当前的canva...

    张风捷特烈
  • 批处理实现:批量为文件添加注释

    未来sky
  • ES6 极简教程(ES6 Tutorial) 文 / 东海陈光剑ES6 极简教程(ES6 Tutorial)Kotlin 开发者社区

    JavaScript是ECMAScript的实现和扩展,由ECMA(一个类似W3C的标准组织)参与进行标准化。ECMAScript定义了:

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券