性能测试PTS的JMeter压测功能依赖Apache JMeter生成的脚本。本文以JMeter WebSocket Samplers插件为例,介绍如何在本地使用Apache JMeter编写、调试压测脚本,并在PTS中完成WebSocket协议的压测场景。
方案概览
使用Apache JMeter生成WebSocket压测脚本并在PTS中完成压测,共需以下五步:
1. 安装插件JMeter WebSocket Samplers
下载JMeter WebSocket Samplers,建议下载最新版本(本示例中使用 JMeterWebSocketSamplers-1.2.10.jar)。
将下载的插件.jar包存放在<JMeter安装目录>/lib/ext路径下。
重要在PTS中发起压测时,此处下载的插件.jar包需要上传到PTS。请参见5. 创建JMeter压测场景并启动压测。
重启Apache JMeter。
重启之后,按照以下步骤确认插件是否安装成功:
右键单击Test Plan,选择
,可看到新增的配件元件选项WebSocket Binary Frame Filter、WebSocket Ping/Pong Frame Filter和WebSocket Text Frame Filter。右键单击Test Plan,选择
,可看到新增的断言选项 Binary Response Assertion。右键单击Test Plan,选择
,在编辑页面左下方的下拉列表中,可看到新增的选项Binary。右键单击Test Plan,选择
,右键单击Thread Group,选择 ,可看到以下新增的采样器选项。重要因为WebSocket是长连接流式通讯,所以可能存在发送一个请求收到多条响应的情况。收到的响应会以先后顺序排在一个响应队列中。当执行一个有读操作的Sampler时,就从队列头部取出一个响应;每当收到一个响应时,就将其放到队列尾部。
WebSocket Single Read Sampler是一个只读Sampler,它只从队列头部读取一个响应,如果读不到就等待,直至超时。
WebSocket Single Write Sampler是一个只写Sampler,它只向连接通道发送一个请求且不等待响应。
WebSocket Request Response Sampler是一个读写Sampler,它向连接通道发送一个请求,然后从响应队列头部读取一个响应,如果读不到就等待,直至超时。
如果放置的读Sampler和写Sampler数量不合适,可能会出现读到的数据错位的现象。
关于本文没有涉及的代理、过滤、分片等信息,请参见 JMeter WebSocket Samplers 插件介绍。
2. 创建脚本
这里将演示如何在测试场景中添加并配置Sampler。以下为简单示例,您可以根据业务需要进行调整。
右键单击Test Plan,选
,将一个线程组添加到测试计划中。在Thread Group中依次添加以下采样器(Sampler),并进行配置。
Sampler名称
说明
WebSocket Open Connection
建立一个WebSocket连接
WebSocket Ping/Pong
控制帧,发送Ping并接收Pong
WebSocket request-response Sampler
发送和接收文本或二进制WebSocket帧
WebSocket Single Write Sampler
发送文本或二进制WebSocket帧
WebSocket Single Read Sampler
接收文本或二进制WebSocket帧
WebSocket Close
关闭WebSocket连接
右键单击Thread Group,选择
。说明Server URL配置请替换成您的待测服务配置。这里使用Python搭建一个简易的WebSocket服务来做演示。这是一个Echo服务,因此发送到此服务的所有消息都将回显给客户端,
server.py
代码如下:import asyncio import websockets async def echo(websocket, path): async for message in websocket: message = "Your message: {}".format(message) await websocket.send(message) asyncio.get_event_loop().run_until_complete(websockets.serve(echo, '0.0.0.0', 8080)) asyncio.get_event_loop().run_forever()
右键单击Thread Group,选择
。说明Pong(read)timeout(ms):6000
Pong(读)超时表示如果JMeter在6000ms内没有收到Pong消息,则Sampler将失效。此Sampler会复用已有连接。
右键单击Thread Group,选择
。配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接。
数据类型
Text
指定数据类型、请求数据和响应超时值。
Request data
PTS
请求数据,这里以文本为例
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择
。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
Text
指定数据类型、请求数据和响应超时值
Request data
PTS bang bang bang
请求数据,这里以文本为例
右键单击 Thread Group,选择
。接收服务端的消息响应需要使用这个Sampler。配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
文本
指定数据类型、请求数据和响应超时值
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择
。此采样器将关闭现有的WebSocket连接,由于是协商关闭,响应消息为:1000:sampler requested close
。配置项
示例值
说明
Close Status
1000
关闭连接时定义的状态码,数据帧的头两个字节
Response (read) timeout (ms)
6000
响应超时时间
(可选)如果您需要在通信中添加Token等Header,单击Thread Group,选择JMeter官方文档。
,在线程组中添加配置元件HttpHeaderManager,并添加对应的Header。具体详情,请参见右键单击Thread Group,选择
,在线程组中添加监听器View Results Tree。
3. 调试脚本
脚本编辑完成后,单击页面顶部的开始按钮,运行脚本。
通过View Results Tree监听器查看脚本是否运行正常。在该监听器中,如果Sampler前面有绿色对勾表示运行正常。如出现运行异常的Sampler,请参见2. 创建脚本进行调试。
部分示例结果如下:
WebSocket request-response Sampler
根据脚本配置,Request信息如下:
根据脚本配置,Text格式的Response data如下:
WebSocket Single Read Sampler
根据脚本配置,Text格式的Response data如下:
4. 导出脚本
当本地脚本调试成功后,选择顶部菜单栏的
,将脚本文件保存至本地。5. 创建JMeter压测场景并启动压测
登录PTS控制台,在左侧导航栏选择 ,然后单击JMeter压测。
在创建JMeter场景页面,输入场景名。
场景配置
在场景装配区域,单击图标,上传4. 导出脚本中导出的
.jmx
文件。单击上传文件,添加第1步中下载的JMeter WebSocket Samplers的JAR包(本文使用JMeterWebSocketSamplers-1.2.10.jar)和其他数据文件,例如csv格式的参数文件等。
施压配置
示例中压力来源选择阿里云VPC内网,您可根据需要合理选择压力来源以及施压参数,更多配置请参考压力模式与量级配置。
启动压测
单击保存去压测,并在弹出的对话框中执行周期选择立即执行。待压测准备完成,操作页会进入压测状态。
关于在PTS中进行JMeter压测的更多信息,请参见创建JMeter场景。
后续操作
压测结束之后,系统会自动获取压测过程中的数据,例如压测场景指标、业务详情数据、监控详情数据和API采样日志等,形成压测报告。更多信息请参考:查看JMeter压测报告。