一、前言
经过“开源模型应用落地”系列文章学习之后,我们成功地建立了一个完整可落地的AI交付流程。现在,我们即将要测试一下这个流程的性能瓶颈。在这篇文章中,将介绍如何使用JMeter工具对我们的即时消息服务和AI服务进行压力测试。
二、术语
2.1、JMeter
是一个开源的性能测试工具,它被广泛用于对软件应用程序、网络服务器和各种服务进行负载测试。JMeter最初是为测试Web应用程序而设计的,但现在已经扩展到测试其他类型的客户端/服务器应用程序和协议。
JMeter具有一个直观的图形用户界面,可以通过该界面创建测试计划。测试计划定义了测试的目标和行为,包括模拟大量用户同时访问服务器,并测量服务器在负载下的性能表现。
JMeter可以模拟多种类型的负载,包括并发用户、线程组、请求类型和数据参数化。它可以发送HTTP请求、FTP请求、数据库查询、邮件请求等,并测量服务器的响应时间和吞吐量。
JMeter还提供了丰富的报告和图表,用于分析和可视化测试结果。这些报告和图表可以帮助开发人员和测试人员识别应用程序中的性能瓶颈,并进行优化。
2.2、压力测试
是一种软件测试方法,用于评估系统、应用程序或网络服务在各种负载条件下的性能表现。其目的是确定系统在正常或峰值负载时的稳定性、可靠性和响应能力。
在压力测试中,系统会被暴露在高负载、高并发的情况下,以模拟实际使用环境下的情况。通过增加用户数量、请求频率或数据量等,测试人员可以观察系统在这种压力下的表现。
压力测试通常包括以下几个重要方面:
2.3、WebSocket协议
是一种在Web应用程序中实现双向通信的协议。传统的HTTP协议是基于请求-响应模式的,即客户端发送请求,服务器返回响应,然后连接关闭。而WebSocket协议允许服务器和客户端之间建立长连接,实现双向通信,从而实时地传输数据。
三、使用方式
3.1、让JMeter支持WebScoket协议
# 下载JMeter WebSocket Samplers,地址:
https://bitbucket.org/pjtr/jmeter-websocket-samplers/downloads/
PS:
1. 我使用的JMeter版本是5.3,这里下载1.2.8版本的插件。(1.29版本的插件无法生效)
# 将下载的插件.jar包存放在
# 验证是否安装成功
右键点击TestPlan >> Add >> Config Element,是否出现WebSocket相关的选项
3.2、创建测试脚本
# 根据项目情况,我们需要用到WebSocket request-response Sampler(WebSocket Request Response Sampler是一个读写Sampler,它向连接通道发送一个请求,然后从响应队列头部读取一个响应,如果读不到就等待,直至超时),WebSocket Close以及Random Variable
1、添加第一个Sampler。右键点击Thread Group >> Sampler >> WebSocket request-response Sampler。
填写IM服务的地址信息,端口信息、路径以及请求参数
PS:
1、可以复用已存在的WebScoket连接,前提就是在此之前,添加WebScoket Open Connection选项
2、添加第二个Sampler。右键点击Thread Group >> Sampler >> WebSocket request-response Sampler。
填写IM服务的请求参数
PS:
1、此处复用已存在的WebScoket连接,即第一步配置好的WebScoket通道
2、注意${userId}代表使用JMeter配置的变量,参见下面的Random Variable
3、添加第一个监听器。右键点击Thread Group >> Listener >> View Results Tree。
4、添加第二个监听器。右键点击Thread Group >> Listener >> Aggregate Report。
5、添加随机参数。
填写变量名,取值范围
PS:
1、IM服务中,会校验userId是否小于10000,此处简单设置userId取值范围是大于10000即可
6、完整配置
3.3、启动测试
# 点击绿色三角形选项启动测试
# 服务端输出
PS:
1、需要提前启动IM服务、AI服务以及相关的第三方软件。
3.4、测试结果查看
# View Result Tree
# Aggregate Report
四、附带说明
4.1、WebSocket是长连接流式通讯,可能存在发送一个请求收到多条响应的情况。收到的响应会以先后顺序排在一个响应队列中。当执行一个有读操作的Sampler时,就从队列头部取出一个响应;每当收到一个响应时,就将其放到队列尾部。
4.2、如果放置的读Sampler和写Sampler数量不合适,可能会出现读到的数据错位的现象。