前一篇文章 使用四种框架分别实现百万websocket常连接的服务器 介绍了四种websocket框架的测试方法和基本数据。 最近我又使用几个框架实现了websocket push服务器的原型,并专门对这七种实现做了测试。 本文记录了测试结果和一些对结果的分析。
这七种框架是:
- Netty
- Undertow
- Jetty
- Vert.x
- Grizzly
- spray-websocket
- nodejs-websocket/Node.js
测试环境
使用三台C3.4xlarge AWS服务器做测试。 一台作为服务器,两台作为客户端机器, 每台客户端机器启动10个client,一共20个clientC3.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)时,发送消息时
测试结果
Netty | Vert.x | Undertow | Jetty | Grizzly | Spray | Node.js | |
Setup时 | cpu idle: 90% minor gc: Few full gc: No | ||||||
Setup完成后 | 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%="" 99%="" 99.9%=""> |