性能测试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。请参见步骤五:上传脚本、插件JAR包和其他文件至PTS进行压测。
重启Apache JMeter,并按照以下步骤确认插件是否安装成功。
右键单击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,可看到以下新增的采样器选项。
重要因为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,选Add > Thread (Users) > Thread Group,将一个线程组添加到测试计划中。
在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,选择Add > Sampler > WebSocket Open Connection。
说明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,选择Add > Sampler > WebSocket Ping/Pong。
说明Pong(read)timeout(ms):6000
Pong(读)超时表示如果JMeter在6000ms内没有收到Pong消息,则Sampler将失效。此Sampler会复用已有连接。
右键单击Thread Group,选择Add > Sampler > WebSocket request-response Sampler。
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接。
数据类型
Text
指定数据类型、请求数据和响应超时值。
Request data
PTS
请求数据,这里以文本为例
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择Add > Sampler > WebSocket Single Write Sampler。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
Text
指定数据类型、请求数据和响应超时值
Request data
PTS bang bang bang
请求数据,这里以文本为例
右键单击 Thread Group,选择Add > Sampler > WebSocket Single Read Sampler。接收服务端的消息响应需要使用这个Sampler。
配置项
示例值
说明
Connection
use existing connection
创建新的连接或复用已有连接
数据类型
文本
指定数据类型、请求数据和响应超时值
Response (read) timeout (ms)
6000
响应超时时间
右键单击Thread Group,选择Add > Sampler > WebSocket Close。此采样器将关闭现有的WebSocket连接,由于是协商关闭,响应消息为:
1000:sampler requested close
。配置项
示例值
说明
Close Status
1000
关闭连接时定义的状态码,数据帧的头两个字节
Response (read) timeout (ms)
6000
响应超时时间
(可选)如果您需要在通信中添加Token等Header,单击Thread Group,选择Add > ConfigElement > HttpHeaderManager,在线程组中添加配置元件HttpHeaderManager,并添加对应的Header。具体详情,请参见JMeter官方文档。
右键单击Thread Group,选择Add > Listener > View Results Tree,在线程组中添加监听器View Results Tree。
3. 调试脚本
脚本编辑完成后,单击页面顶部的开始按钮,运行脚本。
通过View Results Tree监听器查看脚本是否运行正常。在该监听器中,如果Sampler前面有绿色对勾表示运行正常。如出现运行异常的Sampler,请参见步骤二:创建脚本进行调试。
部分示例结果如下:
WebSocket request-response Sampler
根据脚本配置,Request信息如下:
根据脚本配置,Text格式的Response data如下:
WebSocket Single Read Sampler
根据脚本配置,Text格式的Response data如下:
4. 导出脚本
当本地脚本调试成功后,选择顶部菜单栏的File > Save Test Plan as,将脚本文件保存至本地,并命名为wsTest.jmx
。
5. 创建JMeter压测场景并启动压测
登录PTS控制台,选择性能测试 > 创建场景,然后单击JMeter压测。
配置场景
输入场景名,并上传导出的
wsTest.jmx
文件。脚本上传成功后,PTS将自动进行插件补全。如果补全失败,您可单击上传文件,添加下载的JMeter WebSocket Samplers的JAR包(本文使用
JMeterWebSocketSamplers-1.2.10.jar
)和其他数据文件,例如CSV
格式的参数文件等。
施压配置
最大虚拟用户数配置为
10
,压测时长和递增时长配置2
分钟。其他配置保持默认即可。发起压测涉及费用问题,建议您合理选择施压量级,如需了解更多信息,请参见计费概述、压力模式与量级配置。调试并启动压测
调试场景可验证配置是否合理,避免压测失败,建议您先调试场景。
单击保存去压测,在温馨提示页面,选择立即执行并勾选确认本次压测已获得准许并遵守当地法律,然后单击启动压测。
关于在PTS中进行JMeter压测的更多信息,请参见创建JMeter场景。
分析压测结果
压测结束后,系统会自动获取压测数据,例如压测场景指标、业务详情数据、监控详情数据和API采样日志等,生成压测报告。更多信息,请参见查看JMeter压测报告。