如何进行WebSocket协议的压测
背景信息
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
本文所述流程通过建立线程组和WebSocket的相关Sampler,来模拟服务端和客户端通过WebSocket协议建立连接,传递数据,断开连接的过程。
如果您需要对WebSocket协议的场景进行压测,您可以使用JMeter的WebSocket的相关Sampler来编写脚本,然后将脚本文件上传至CPTS发起压测。本文将介绍详细步骤。
前期部署
在使用JMeter之前,您需要做好如下准备工作。
- 部署可在公网访问的WebSocket服务。
- 安装JMeter 4.0版。
- 安装WebSocket插件
- 下载WebSocket所需版本JAR包:jmeter-websocket-samplers-1.2.8.jar。
- 拷贝插件JAR包到JMeter安装目录的lib/ext/子目录下。
-
检查WebSocket插件安装成功
- 右键单击Test Plan,选择Add > Config Element,可看到新增的配件元件选项WebSocket Binary Frame Filter, WebSocket Ping/Pong Frame Filter和WebSocket Text Frame Filter。
- 右键单击Test Plan,选择 Add > Assertions,可看到新增的断言选项 Binary Response Assertion。
- 右键单击Test Plan,选择Add > listener > View Results Tree,在编辑页面左下方的下拉列表中,可看到新增的选项Binary。
- 右键单击Test Plan,选择Add > Threads(Users) > Thread Group,右键单击Thread Group,选择Add > Sampler,可看到以下新增的采样器选项。
JMeter脚本编写步骤
- 启动JMeter GUI。
- 为JMeter Test Plan添加一个线程组。
- 右键单击Test Plan,选择Add > Threads (Users) > Thread Group。
- 根据需要修改线程组的参数。
部分参数配置说明:
Name: 线程组名字,建议在多线程组并存时取有意义的名字以区分和查找。
Number of Threads (users): 线程数,既模拟用户的数量。
Ramp-Up Period (in seconds): 线程启动后运行的时长,单位为秒。例:有100个线程,Ramp-Up Period设置为2,既每秒启动50个线程,2秒内启动完成。默认值为0,即所有线程开始后立即启动。
Loop Count:循环次数。若勾选forever,则除非手动停止或崩溃,将一直运行。
- 为线程组添加一组Sampler。右键单击Thread Group1 (Thread Group定义的Name),选择Add > Sampler > 橙色框内Sampler。
注:需按照下述的顺序创建sampler,否则会报错。
- WebSocket Open Connection: 当前sampler建立WebSocket连接。
部分参数配置说明:
Name:Sampler名字。
Comments:注释。
Protocol:Sampler所用协议,包含ws和wss两种。
WS:Web Socket协议,是html5的一种通信协议,该协议兼容我们常用的浏览器。
WSS:Security Web Socket协议,加密链接。
Server Name or IP: 服务器名或IP地址。
Port Number: 端口号。
Path:路径,可为空。
Connection timeout (ms):建立连接的超时时间,单位毫秒。
Read timeout (ms):等待服务器响应的超时时间,单位毫秒。
- WebSocket Ping/Pong:用来测试Ping/Pong功能。
部分参数配置说明:
Name:Sampler名字。
Comments:注释。
ping/pong (send ping, expect pong):发送ping,等待pong消息。
pong (just send pong):仅发送pong消息。
Pong (read) timeout (ms):表示在规定时间内若未收到pong消息,则sampler将失效,单位毫秒。
- WebSocket request-response Sampler:
部分参数配置说明:
Connection:
use existing connection: 使用现有连接。
setup new connection: 创建新连接。
Connection timeout (ms):连接超时时间,单位毫秒。
Data:数据类型。包括text(文本)和binary(二进制)两种形式。
Request Data:请求数据。
Response (read) timeout (ms):响应超时时间,单位毫秒。
- WebSocket Single Write Sampler: 非阻塞请求,将数据发送到服务端不需要等待响应。
部分参数配置说明:
Connection:
use existing connection: 使用现有连接。
setup new connection: 创建新连接。
Data:数据类型。包括text(文本)和binary(二进制)两种形式。
Request Data:请求数据。
- WebSocket Single Read Sampler: 接收服务器发来的消息。
部分参数配置说明:
use existing connection: 使用现有连接。
setup new connection: 创建新连接。
数据类型:包括Text(文本),Binary(二进制),Text or Binary三种形式。
Response (read) timeout (ms):响应超时时间,单位毫秒。
- WebSocket Close Sampler: 关闭现有的WebSocket连接,显示原因为:”1000: sampler requested close”。
部分参数配置说明:
Close status: 关闭连接时定义的状态码,数据帧的前两个字节。
Response (read) timeout (ms): 响应超时时间,单位毫秒。
- 在线程组中添加View Results Tree, 观测结果。右键单击Thread Group,选择Add > Listener > View Results Tree。
- 脚本编辑完成后,单击页面顶部的绿色开始按钮,运行脚本。通过View Results Tree监听器查看脚本是否运行正常。在左侧导航树中,选择View Results Tree,检查所有Sampler是否都配置正确并符合预期。在该监听器中,如果Sampler前面有绿色对勾表示运行正常,如下图所示。如出现运行异常的Sampler,请根据前述步骤重新进行调试。
- 若调试成功,点击Save Test Plan as,并选择合适路径,即可保存为JMX文件。
CPTS操作步骤
将JMX脚本,CSV文件(如有)上传到CPTS-JMeter发压场景,设置压测量级,即可随时发起压测。
具体操作,请参考创建JMeter发压场景。