如何进行 WebSocket 协议的压测

摘要:
背景信息目前,PTS原生压力测试模式不支持压力测试WebSocket协议的业务场景,例如二进制数据传输。WebSocket有很多插件。本文仅以JMeterWebSocketSamples为例。JMeterWebSocketSamples具有以下特性:它提供六种类型的WebSocket采样器,这不会创建额外的线程并节省资源。支持二进制WebSocket数据帧。支持使用JMeter的CookieManager在升级协议请求中设置cookie。关于本文中未涉及的代理、过滤、分片和其他信息,请参阅JMeterWebSocketSamples插件的介绍。当前Sampler将建立WebSocket连接。相关配置如下:配置项的示例值指示协议可以是WS或WSS。右键单击ThreadGroup并选择Add˃Sampler˃WebSocketrequest responseSampler。

通过 Apache JMeter 和对应的插件编写脚本,并在 PTS 中上传这些脚本、插件 JAR 包和其他相关文件,即可发起压测。 本文以 JMeter WebSocket Samplers 插件为例,主要介绍如何在本地使用 Apache JMeter 编写、调试压测脚本,以实现 WebSocket 协议的业务场景压测。

背景信息

目前 PTS 原生压测模式不支持压测 WebSocket 协议的业务场景,例如 binary 的数据发送等场景。可以通过 Jmeter 类型压测来实现。

WebSocket 的插件较多,本文仅以 JMeter WebSocket Samplers 为例。JMeter WebSocket Samplers 具有以下特性:

  • 提供了六种 WebSocket Sampler,这些 Sampler 不会新建额外的线程,节省资源。
  • 支持 WSS(WebSocket over TLS)。
  • JMeter 的 SSLManager 能设置 WSS,包括客户端证书。
  • 支持二进制的 WebSocket 数据帧。
  • 支持二进制响应的断言。
  • View Results Tree 里可以查看二进制结果。
  • 支持使用 JMeter 的 Header Manager 设置 WebScoket Upgrade Request 上额外的 HTTP Header。
  • 支持使用 JMeter 的 Cookie Manager 设置升级协议的请求里的 Cookie。
  • 支持代理。
  • 支持过滤数据帧。

关于本文没有涉及的代理、过滤、分片等信息,请参见 JMeter WebSocket Samplers 插件介绍

操作步骤如下:

步骤一:安装插件 JMeter WebSocket Samplers

  1. 下载 JMeter WebSocket Samplers,建议下载最新版本。
  2. 将下载的插件 .jar 包存放在 <JMeter安装目录>/lib/ext 路径下。
     
    注意 在 PTS 中发起压测时,此处下载的插件 .jar 包需要上传到 PTS。请参见步骤五:上传脚本、插件 JAR 包和其他文件至 PTS 进行压测
  3. 重启 JMeter。

    重启 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,可看到以下新增的采样器选项,具体说明如下。

       
      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 连接

      下一步,需要配置这些 Sampler。

步骤二:创建脚本

下面将演示如何在测试场景中添加并配置 Sampler。以下为简单示例,您可以根据业务需要进行调整。

  1. 在 Jmeter 页面中,右键单击 Test Plan,选 Add > Thread (Users) > Thread Group,将一个线程组添加到测试计划中。
  2. 在线程组中依次添加采样器(Sampler),并进行配置。右键单击 Thread Group,选择 Add > Sampler > WebSocket Open Connection。当前的 Sampler 将建立 WebSocket 连接。
    建立 websocket 链接
     
    说明 我们以 Gateway Echo 服务来创建脚本(wss://echo.websocket.org) 。这是一个 Echo 服务,因此发送到此服务的所有消息都将回显给客户端。

    相关的配置如下:

     
    配置项示例值说明
    协议WS协议可以是 WS 或 WSS(Secure WebSocket)。使用 WSS 进行加密连接。
    Server name or IPecho.websocket.org域名或 IP
    Port443端口
    Path-可为空
    Connection timeout(ms)20000建连的超时时间
    Read timeout(ms)6000等待服务器响应的超时时间
  3. 右键单击 Thread Group,选择 Add > Sampler > WebSocket Ping/Pong。该 Sampler 用来测试 Ping/Pong 功能。
    设置 sampler

    相关配置如下:

    Pong(读)超时(ms):6000

    Pong(读)超时表示如果 JMeter 在 6 秒内没有收到 Pong 消息,则 Sampler 将失效。此 Sampler 会复用已有连接。

  4. 右键单击 Thread Group,选择 Add > Sampler > WebSocket request-response Sampler。
    websocket结果树二进制视图4

    相关配置如下:

     
    配置项示例值说明
    Connectionuse existing connection创建新的连接或复用已有连接。
    数据类型文本指定数据类型、请求数据和响应超时值。
    Request dataPTS请求数据,这里以文本为例
    Response(read)timeout(ms)6000响应超时时间
  5. 右键单击 Thread Group,选择 Add > Sampler > WebSocket Single Write Sampler 。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。
    websocket结果树二进制视图5

    相关配置如下:

     
    配置项示例值说明
    Connectionuse existing connection创建新的连接或复用已有连接
    数据类型文本指定数据类型、请求数据和响应超时值
    Request dataPTS请求数据,这里以文本为例
    Response(read)timeout(ms)6000响应超时时间
  6. 右键单击 Thread Group,选择 Add > Sampler WebSocket Single Read Sampler。接收服务端的消息响应需要使用这个 Sampler。
    websocket结果树二进制视图6

    相关配置如下:

     
    配置项示例值说明
    Connectionuse existing connection创建新的连接或复用已有连接
    数据类型文本指定数据类型、请求数据和响应超时值
    Response(read)timeout(ms)6000响应超时时间
  7. 右键单击 Thread Group,选择 Add > Sampler WebSocket Close。接收服务端的消息响应需要使用这个 Sampler。
    websocket结果树二进制视图7

    相关配置如下:

     
    配置项示例值说明
    Close Status二进制关闭连接时定义的状态码,数据帧的头两个字节
    Response(read)timeout(ms)6000响应超时时间

    此采样器将关闭现有的 WebSocket 连接,由于是协商关闭,显示原因为 “1000:sampler requested close”。

  8. 右键单击 Thread Group,选择 Add Listener View Results Tree,在线程组中添加监听器 View Results Tree。接收服务端的消息响应需要使用这个 Sampler。

步骤三:运行脚本

脚本编辑完成后,单击页面顶部的开始按钮,运行脚本。

通过 View Results Tree 监听器查看脚本是否运行正常。在左侧导航树中,选择View Results Tree,检查所有 Sampler 是否都配置正确并符合预期。在该监听器中,如果 Sampler 前面有绿色对勾表示运行正常。

如出现运行异常的 Sampler,请参见步骤二:创建脚本进行调试。

部分示例结果如下:

  • WebSocket request-response Sampler

    根据脚本配置,Request 信息如下:

    示例结果图1

    根据脚本配置,Binary 格式的 Response data 如下:

    示例结果图2
  • WebSocket Single Read Sampler

    根据脚本配置,Text 格式的 Response data 如下:

    示例结果图3

    根据脚本配置,Binary 格式的 Response data 如下:

    示例结果图4

步骤四:导出脚本

当本地脚本调试成功后,选择顶部菜单栏的 File Save Test Plan as,将脚本文件保存至本地。

步骤五:上传脚本、插件 JAR 包和其他文件至 PTS 进行压测

您需准备以下文件,上传到 PTS:

  1. 导出的 JMeter 脚本(.jmx 文件)
  2. JMeter WebSocket Samplers 的 JAR 包
  3. 脚本中使用的其他数据文件

关于在 PTS 中压测的操作步骤,请参见 JMeter 压测

免责声明:文章转载自《如何进行 WebSocket 协议的压测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS 启动时间优化golang实现命令行程序的使用帮助下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

文本方式打开文件 二进制方式打开文件 , 到底有啥区别呢 实测说话

大家常用到fopen打开文件,准备进行写操作,再用fwrite把数据写入文件,最后用fclose关闭文件。如以下C代码: #include <stdio.h>char buf[10] = {10,10,10,10,10,10,10,10,10,10}; FILE *fp = fopen("c:\test.dat","w");fwrite(buf...

Jmeter自动化测试 数据驱动测试,将数据存入csv文件中来调用,或将数据存在DB中进行调用

1. 将测试的用例名称,测试请求方式,测试链接,预置数据,断言等都放到excel中,然后转成csv格式,在用Jmeter带的csv数据配置文件导入 运行之前将线程组中配置,线程数设置为1,循环的次数设置为测试用例数! 点击执行,将一各个请求顺序执行。 测试数据如下: Jmeter测试计划如下: 注意:excel格式转csv的时候,涉及到字符转义,入参...

jmeter使用复习

多终端进程: 配置客户端远程的ip地址和port 在客户端jmeter安装目录的bin目录下,修改配置文件 jmeter.properties 默认的remote_hosts 的值:(将肉鸡的地址加入到hosts后面) 然后去到jmeterGUI界面内,选择远程启动, 注:远程的jmeter版本与脚本必须一致,否则会报错。 html报告生成: 1. cmd...

Java Android 二进制文件读写

https://blog.csdn.net/u012734708/article/details/88354539 1.读取android工程中本地二进制文件Android studio工程目录中有二进制文件abcd.raw 。二进制文件所放目录 app/src/main/assets/abcd.raw 1.1一次性读取二进制文件 private byte...

可执行二进制文件的形成过程与简单调试

1) 预处理:主要对源码预编译语句(如宏定义define)和文件包含进行处理。即对宏指令替换和包含文件放置到需要编译的文件中,完成后会生成完整的C程序源文件。 2) 编译:对预处理以后文件进行编译,生成.s后缀的汇编语言文件,即该文件里是汇编语言的代码,汇编是一种更底层的语言,直接对硬盘进行操作。 3) 汇编:对汇编语言文件进行汇编,主要调用汇编处理程序来...

Jmeter进阶篇之监控服务器cpu,内存

对于Jmeter,可以不再赘述,因为介绍得也够多了。 那么相信有部分同学已经尝试着自主去学习如果使用Jmeter对服务器进行压力测试了。 但是可能也会发现,Jmeter好像监控不了服务器的cpu已经内存等等呀。其实不然,Jmeter提供了非常非常多的插件。 插件已经帮你们准备好,获取路径: https://pan.baidu.com/s/15KUdM-Zz...