文档

如何进行WebSocket协议的压测

更新时间:

性能测试PTS的JMeter压测功能依赖Apache JMeter生成的脚本。本文以JMeter WebSocket Samplers插件为例,介绍如何在本地使用Apache JMeter编写、调试压测脚本,并在PTS中完成WebSocket协议的压测场景。

方案概览

使用Apache JMeter生成WebSocket压测脚本并在PTS中完成压测,共需以下五步:

1. 安装插件JMeter WebSocket Samplers

  1. 下载JMeter WebSocket Samplers,建议下载最新版本(本示例中使用 JMeterWebSocketSamplers-1.2.10.jar)。

  2. 将下载的插件.jar包存放在<JMeter安装目录>/lib/ext路径下。

    重要

    在PTS中发起压测时,此处下载的插件.jar包需要上传到PTS。请参见5. 创建JMeter压测场景并启动压测

  3. 重启Apache JMeter。

    重启之后,按照以下步骤确认插件是否安装成功:

    1. 右键单击Test Plan,选择Add > Config Element,可看到新增的配件元件选项WebSocket Binary Frame FilterWebSocket Ping/Pong Frame FilterWebSocket Text Frame Filterimage

    2. 右键单击Test Plan,选择 Add > Assertions,可看到新增的断言选项 Binary Response Assertionimage

    3. 右键单击Test Plan,选择Add > listener > View Results Tree,在编辑页面左下方的下拉列表中,可看到新增的选项Binary

      image

    4. 右键单击Test Plan,选择Add > Threads(Users) > Thread Group,右键单击Thread Group,选择Add > Sampler,可看到以下新增的采样器选项。

      image

      重要
      • 因为WebSocket是长连接流式通讯,所以可能存在发送一个请求收到多条响应的情况。收到的响应会以先后顺序排在一个响应队列中。当执行一个有读操作的Sampler时,就从队列头部取出一个响应;每当收到一个响应时,就将其放到队列尾部。

      • WebSocket Single Read Sampler是一个只读Sampler,它只从队列头部读取一个响应,如果读不到就等待,直至超时。

      • WebSocket Single Write Sampler是一个只写Sampler,它只向连接通道发送一个请求且不等待响应。

      • WebSocket Request Response Sampler是一个读写Sampler,它向连接通道发送一个请求,然后从响应队列头部读取一个响应,如果读不到就等待,直至超时。

      • 如果放置的读Sampler和写Sampler数量不合适,可能会出现读到的数据错位的现象。

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

2. 创建脚本

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

  1. 右键单击Test Plan,选Add > Thread (Users) > Thread Group,将一个线程组添加到测试计划中。

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

    1. 右键单击Thread Group,选择Add > Sampler > WebSocket Open Connection

      image

      说明

      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()
    2. 右键单击Thread Group,选择Add > Sampler > WebSocket Ping/Pong

      image

      说明

      Pong(read)timeout(ms):6000

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

    3. 右键单击Thread Group,选择Add > Sampler > WebSocket request-response Samplerimage

      配置项

      示例值

      说明

      Connection

      use existing connection

      创建新的连接或复用已有连接。

      数据类型

      Text

      指定数据类型、请求数据和响应超时值。

      Request data

      PTS

      请求数据,这里以文本为例

      Response (read) timeout (ms)

      6000

      响应超时时间

    4. 右键单击Thread Group,选择Add > Sampler > WebSocket Single Write Sampler。此请求是非阻塞的,只是将数据发送到服务端不需要等待响应。image

      配置项

      示例值

      说明

      Connection

      use existing connection

      创建新的连接或复用已有连接

      数据类型

      Text

      指定数据类型、请求数据和响应超时值

      Request data

      PTS bang bang bang

      请求数据,这里以文本为例

    5. 右键单击 Thread Group,选择Add > Sampler > WebSocket Single Read Sampler。接收服务端的消息响应需要使用这个Sampler。image

      配置项

      示例值

      说明

      Connection

      use existing connection

      创建新的连接或复用已有连接

      数据类型

      文本

      指定数据类型、请求数据和响应超时值

      Response (read) timeout (ms)

      6000

      响应超时时间

    6. 右键单击Thread Group,选择Add > Sampler > WebSocket Close。此采样器将关闭现有的WebSocket连接,由于是协商关闭,响应消息为:1000:sampler requested closeimage

      配置项

      示例值

      说明

      Close Status

      1000

      关闭连接时定义的状态码,数据帧的头两个字节

      Response (read) timeout (ms)

      6000

      响应超时时间

  3. 可选)如果您需要在通信中添加Token等Header,单击Thread Group,选择Add > ConfigElement > HttpHeaderManager,在线程组中添加配置元件HttpHeaderManager,并添加对应的Header。具体详情,请参见JMeter官方文档

  4. 右键单击Thread Group,选择Add > Listener > View Results Tree,在线程组中添加监听器View Results Tree

3. 调试脚本

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

通过View Results Tree监听器查看脚本是否运行正常。在该监听器中,如果Sampler前面有绿色对勾表示运行正常。如出现运行异常的Sampler,请参见2. 创建脚本进行调试。

部分示例结果如下:

  1. WebSocket request-response Sampler

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

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

  2. WebSocket Single Read Sampler

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

4. 导出脚本

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

5. 创建JMeter压测场景并启动压测

  1. 登录PTS控制台,在左侧导航栏选择性能测试 > 创建场景,然后单击JMeter压测

  2. 创建JMeter场景页面,输入场景名

  3. 场景配置

    1. 场景装配区域,单击image.png图标,上传4. 导出脚本中导出的.jmx文件。image

    2. 单击上传文件,添加第1步中下载的JMeter WebSocket Samplers的JAR包(本文使用JMeterWebSocketSamplers-1.2.10.jar)和其他数据文件,例如csv格式的参数文件等。image

  4. 施压配置

    示例中压力来源选择阿里云VPC内网,您可根据需要合理选择压力来源以及施压参数,更多配置请参考压力模式与量级配置image

  5. 启动压测

    单击保存去压测,并在弹出的对话框中执行周期选择立即执行。待压测准备完成,操作页会进入压测状态。

关于在PTS中进行JMeter压测的更多信息,请参见创建JMeter场景

后续操作

压测结束之后,系统会自动获取压测过程中的数据,例如压测场景指标、业务详情数据、监控详情数据和API采样日志等,形成压测报告。更多信息请参考:查看JMeter压测报告