lsekfe 发表于 2021-9-13 13:27:15

性能进阶:使用JMeter进行websocket测试

摘要
  本次测试案例主要是分享如何使用jmeter进行websocket协议下的聊天接口性能测试。包含websocket插件的下载安装、线程组及sampler的设置、csv参数化和组建分布式测试的方法、如何通过调整参数来获得发压机的最大并发数以及对测试过程的总结。整篇文章只侧重介绍进行websocket测试的思路,对具体工具的使用步骤较少着墨,因为网上已有不少相关介绍文章。希望本篇文章可以对其他正准备用jmeter进行websocket测试的读者提供一些参考。本人水平有限,如有错误恳请批评指正,感谢!

  正文
  最近收到一个任务,需要对公司的即时通讯服务端进行压测及聊天接口性能测试,这款即时通讯软件的客户端是通过websocket协议与服务端通信的。但我之前只做过http协议的测试,websocket协议还是第一次。于是我在网上搜索websocket协议的压测工具,一番比较后选中了jmeter,选择jmeter的原因有以下几点:1.jmeter是一款免费开源的软件,有成熟的社区及插件管理工具,满足用户的各种需求。2.jmeter包含windows、mac、linux多平台版本,对发压机支持较好。3.jmeter支持GUI和CLI两种操作模式,配置分布式压测步骤简单快捷,网上有很多关于jmeter的安装使用说明,这里我就不再赘述直接进入websocket的相关测试工作。

  一.安装JMeterWebsocketSampler插件
  jmeter不自带websocket功能,需要安装插件,这个插件直接安装最新的就行了,我用的是1.2.8版本。将下载好的jar包放在jmeter目录下的lib/ext里,然后打开jmeter将websocket sampler勾选上再重启jmeter就安装好JMeterWebsocketSampler插件了。
http://www.51testing.com/attachments/2021/09/15326825_202109091354431jxwS.png

  二.新建线程组和sampler
http://www.51testing.com/attachments/2021/09/15326825_202109091354432IJsF.png

  这里我先把发压机的线程数设置为100,所有线程立即初始化,运行5分钟。发压机支持的最大线程数跟发压机的配置有关,我的机器配置是6核12线程,能够设置的最大线程数是160,再多就会运行报错。但是我的机器线程设置超过100后发送速度也不再增加,想知道自己发压机刚好到达最大发送速度时的线程数,可以设置ramp-up period,比如设置60秒,120个线程,就是平均每秒初始化两个线程,到第60秒时刚好全部初始化完毕。我自己测试从50秒往后发送速度就不再增加了,所以就设置为100了。
  然后添加websocket connection sampler、websocket send sampler、websocket connection close sampler,分别用于建立连接、发送请求、断开连接操作。由于是压测案例,所以我用到了Loop Controller,可以用于控制sampler的循环次数,并且客户端只管发送,不接收服务端的响应,因为我依靠另一端实际接收到的消息数判断发送是否成功,这样可以避免等待响应阻塞进程。我的配置如图所示:
http://www.51testing.com/attachments/2021/09/15326825_20210909135443332Dk.png

  我把infinite勾选上了,表示在5分钟的压测时间内让sampler不限次数地循环,这样可以测出sampler在指定时间内能够完成的最大次数。

  三.CSV参数化
  对于jmeter来说,每一个线程就是一个用户,所以设置100个线程就需要100个测试用户的账号、密码及发送数据。添加CSV DATA Set Config步骤,csv的配置我这里不再赘述,不过需要说明的是测试服务端处理聊天消息的性能,最好是多组一对一聊天这样的设置,比如我的就是50个用户分别给另外50个用户发送消息,这样符合真实使用场景,也能测出服务端的真实性能。

  四.分布式测试
  按以上步骤找到每台压测机的最大线程数后,就可以开始分布式测试了。另找一台机器作为主控机,确保每台压测机与主控机的网络互通。在jemter.properties里的remote_hosts添加压测机的ip和端口,server_port是jmeter启动的端口,压测机用jmeter-server启动。如果主控机与压测机之间的RMI不是SSL连接,记得将server.rmi.ssl.disable=true的注释解开。server-rmi-localport是用于本机跟其它机器通信的RMI端口,如果要使压测机的压测数据回传主控机,需要将压测机及主控机jemter.properties里的mode=standard注释解开。
  保存后主控机使用CLI输入命令jmeter -n -t “Webim Thread Group.jmx” -R x.x.x.x,y.y.y.y -l wbeimlog.jtl -e -o repoort(-R后跟压测机ip,多台用逗号分隔)就可以使用主控机对压测机发送指令了。压测机接收到指令后会在CLI界面上显示如下信息:
http://www.51testing.com/attachments/2021/09/15326825_202109091354434K1nu.png

  结合压测机回传的数据可以逐台添加压测机以探测服务端的极限性能。汇总的数据在命令行里指定的report目录里,打开index.html页面可以查看统计数据的饼状图,如下图所示:
http://www.51testing.com/attachments/2021/09/15326825_202109091354435oQKP.png

  根据统计数据可以看到发送的总次数、成功次数、错误情况等信息,对测试案例进行调整。到此使用jmeter进行websocket性能测试就算完成了。

  五.测试过程总结
  整个测试的关键点有三处:一是调整发压机参数使并发数达到最大。二是设置每对聊天账号都是一对一,不等待服务端响应,以便获得最真实的服务端性能。三是根据压测机回传的数据分析出压测机所需的数量,进而测试出服务端的最大性能。我这边整个测试工作都处于测试环境进行,取得的测试数据并不能完成代表真实生产环境下的情况,仅可以用作预测生产环境下的性能表现。

Miss_love 发表于 2021-9-14 11:12:24

学习下
页: [1]
查看完整版本: 性能进阶:使用JMeter进行websocket测试