性能测试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。
-
重启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 Open Connection、WebSocket Ping/Pong、WebSocket Single Read Sampler、WebSocket Single Write Sampler 和 WebSocket request-response 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。
在 WebSocket Open Connection 配置面板的 Server URL 区域,协议选择
ws,Server name or IP 填写echo.example.com,Port 填写8080。Connection timeout (ms) 设置为20000,Read timeout (ms) 设置为6000。说明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。
在 Behaviour 区域选择 ping/pong (send ping, expect pong) 模式。
说明Pong(read)timeout(ms):6000
Pong(读)超时表示如果JMeter在6000ms内没有收到Pong消息,则Sampler将失效。此Sampler会复用已有连接。
-
右键单击Thread Group,选择Add - Sampler - WebSocket request-response Sampler。
配置面板包含 Connection、Data(请求数据类型与内容)等区域,关键字段说明如下表所示。
配置项
示例值
说明
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,请参见2. 创建脚本进行调试。
部分示例结果如下:
-
WebSocket request-response Sampler
根据脚本配置,Request信息如下:
Connect URL: ws://echo.example.com:8080/ (using existing connection) Request data: PTS根据脚本配置,Text格式的Response data如下:在 View Results Tree 监听器中,所有 WebSocket 采样器(Open Connection、Ping/Pong、request-response Sampler、Single Write Sampler、Single Read Sampler、Close)均显示为执行成功。选中 WebSocket request-response Sampler,在 Response data 选项卡的 Response Body 中返回
Your message: PTS,表示请求-响应交互正常。 -
WebSocket Single Read Sampler
根据脚本配置,Text格式的Response data如下:在 View Results Tree 中查看调试结果,所有 WebSocket 采样器均显示执行成功。选中 WebSocket Single Read Sampler,切换到 Response data 标签页,响应体返回
Your message: PTS bang bang bang,表明 WebSocket 消息收发正常。
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分钟。其他配置保持默认即可。发起压测涉及费用问题,建议您合理选择施压量级,如需了解更多信息,请参见计费概述、压力模式与量级配置。在施压配置区域,将压力来源设置为公网,压力模式设置为虚拟用户模式,流量模型设置为手动调速,最大虚拟用户设置为10,起始百分比设置为100%,压测时长设置为2分钟,是否指定循环选择否,指定IP数保持为1,流量地域定制和IPv6流量保持关闭。 -
调试并启动压测
-
调试场景可验证配置是否合理,避免压测失败,建议您先调试场景。
-
单击保存去压测,在温馨提示页面,选择立即执行并勾选确认本次压测已获得准许并遵守当地法律,然后单击启动压测。
-
关于在PTS中进行JMeter压测的更多信息,请参见创建JMeter场景。
分析压测结果
压测结束后,系统会自动获取压测数据,例如压测场景指标、业务详情数据、监控详情数据和API采样日志等,生成压测报告。更多信息,请参见查看JMeter压测报告。