写点什么

JMeter 集成底座项目压测心得

作者:agileai
  • 2022 年 6 月 17 日
  • 本文字数:5660 字

    阅读完需:约 19 分钟

JMeter集成底座项目压测心得

对于产品和技术型公司来说产品是根本,产品精品化是快速推进项目的重要指标,因此产品要体系化。我们公司产品已经形成了体系化,公司产品在一个个项目中不断迭代升级,逐渐成熟稳定,这对于我们公司来说是一个重要突破,也是以后发展的重要环节。


产品是否是精品要从很多角度评价,需要从功能性、易用性、扩展性、稳定性、高性能等不同维度考察,其中高性能是检测产品运行是否流畅的指标,产品在测试阶段压力性能测试是重要环节。

▎整体介绍


最近在完善集成底座项目流程,进行 IDM 压力测试,这就需要外围工具 JMeter,本文既是通过 JMeter 对监控提醒功能性能的检验的介绍,也是对 JMeter 的介绍。

1.产品介绍


IDM 产品叫做统一身份管理平台,主要用于解决企业 5A 功能的需求,5A 主要包括:Account 账号管理、Authentication 认证管理、Authorization 授权管理、Audit 审计管理、Application Control 应用管控。



IDM 身份管理平台满足对企业信息系统的统一用户管理、统一身份认证、统一授权管理以及安全审计的要求,能够实现各业务系统的统一登录和集中访问,实现用户身份和权限的统一认证与授权管理,为企业不同的业务系统提供统一的用户管理和认证服务。

2.功能架构



IDM 的功能架构主要是从 5A 管控的角度出发总结的架构模型,5A 分别是统一认证、统一授权、统一账户、统一审计、统一应用管控,其中统一应用管控包含对各个应用系统账户的下发情况的管控(统一账户)、对当前业务系统的用户认证情况管控(统一认证)以及对当前系统的权限资源同步监控管控(统一权限)。

3.需求说明


本次性能测试的测试策略是使用 JMeter 结合 IDM 平台,通过模拟 IDM 统一认证登录跳转的运行,测试业务场景的事务响应时间和相关服务器的资源消耗情况,为客户提供一份完整的测试报告,本篇报告着重对云平台性能进行压测和记录结果,从并发量、稳定性两方面测试,确保功能服务达到实际生产标准。

▎JMeter 介绍


通过上述描述,相信大家已经知道产品性能的重要性,在开发时不仅需要注意开发规范,产品性能测试也是必须要做的事情,开发功能要进行一次压测,压测需要工具,而工具就要用 JMeter。

1.环境搭建


注:在安装 JMeter 之前,请先检查下电脑有没有装 JDK:开始→运行→然后输入 cmd→进入命令行界面,输入 java -version , 出现以下信息就是此电脑已安装了 JDK。



JMeter 下载官网:http://JMeter.apache.org/download_JMeter.cgi



1.首先在 JMeter 官网下载一个压缩包,解压放到自己创建的文件夹路径下。


2.然后点击 JMeter 目录下 bin 文件夹里的 JMeter.bat 就可以打开 JMeter,具体最后打开的界面如下:



当出现这个页面,就说明你的 JMeter 环境已经搭建好了。


启动方式:


1.GUI 启动(主要用于编写,调试脚本)双击 JMeter.bat 启动界面模式。



2.命令行启动(用于压力测试):


-h 帮助→打印出有用的信息并退出;


-n 非 GUI 模式→在非 GUI 模式下运行 JMeter;


-t 测试文件→要运行的 JMeter 测试脚本文件;


-l 日志文件→记录结果的文件;


-r 远程执行→启动远程服务;


-H 代理主机→设置 JMeter 使用的代理主机;


-P 代理端口→设置 JMeter 使用的代理主机的端口号。


例如:


JMeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080



3.远程启动(用于分布式压力测试)


a)编辑 apache-JMeter-3.1\bin 下 JMeter.properties 文件,多台 ip 用逗号隔开;


b)复制一份 JMeter 应用到配置 ip 的机器上,并启动 apache-JMeter-3.1\bin 下 JMeter-server.bat 作为 slaver;


c)master 上远程启动 slaver。


2.功能说明


下图是需要调用请求操作:



选择线程组后右键添加,然后选择取样器:



1.序号 1:填写协议:http、https。


2.序号 2:要调用服务器的 ip 或者域名。


3.序号 3:端口。


4.序号 4:请求方法:get、post。


5.序号 5:访问路径。



启动时要选择相关压测指标:


1.序号 1:线程数,是添加并发多少。


2.序号 2:时间,多长时间。


3.序号 3:调用次数。

3.组件介绍


典型、常用组件介绍:


1.测试计划:是使用 JMeter 测试的开始,是其他元件的容器;通常根据项目来为测试计划重命名。


2.用户定义的变量:可以赋予动态获取值,使用 ${变量名} 引用。


3.线程组:用来设置发送请求的用户数,即并发数,还有线程的时间间隔、循环次数。


4.取样器(HTTP 请求):填写 HTTP 请求的协议,方法以及参数。


5.监听器:负责收集测试结果,并给出结果显示方式,常用查看结果树和聚合报告。


6.控制器:结合采样器 sampler 使用,可以模拟复杂的请求序列;常见的分逻辑控制器,循环控制器以及事务控制器。


7.断言:用来判断响应结果是否如用户所预期的,自动化测试接口,基本上都要加断言来判断响应结果。


8.配置元件:主要是参数化中用到 CSV Data Set Config。


9.前置处理器:负责在生成请求之前完成工作,常用来修改请求设置。


10.后置处理器:负责在生成请求之后完成工作,常用来处理响应数据,主要是在动态关联中用到后置处理器的正则表达式。


11.定时器:负责定义请求之间的延迟间隔。


12.参数化设置,两种类型:一种是利用函数助手中的_Random 函数进行参数化设置; 另一种利用配置元件中的 CSV Data Set Config 进行参数化设置。


13.动态数据关联:在 HTTP 请求的参数中会遇到一些参数的值是从服务器响应返回的动态数据,这些数据需要进行关联才能使得下一次请求能成功地被服务器接收。在 JMeter 中,采用正则表达式提取器来获取这些动态数据。

▎测试过程


JMeter 是一款非常流行和受欢迎的开源性能测试工具,像 LoadRunner 一样,它也提供了一个利用本地 Proxy Server(代理服务器)来录制生成测试脚本的功能。

1.数据准备


JMeter 测试我们首先要准备测试所需要的数据,账户信息如下:


2.脚本录制


下面以 CAS 认证脚本为例:


1.右键[测试计划]-[添加]-[线程]-[线程组]。



2.右键[线程组]-[配置元件]-[HTTP 信息头管理器]。



3.右键[线程组]-[配置元件]-[HTTP Cookie 管理器]。



4.右键[线程组]-[配置元件]-[用户定义的变量]。



5.右键[线程组]-[配置元件]-[CSV Data Set Config](添加数据文件配置)。



6.右键[线程组]-[取样器]-[HTTP 请求](填写跳转 CAS 登录地址)。



7.右键[HTTP 请求]-[后置处理器]-[正则表达式提取器](这里添加两个正则提取器:提取 lt 和 execution 后面登录要用到)。



8.右键[线程组]-[取样器]-[HTTP 请求](填写 CAS 登录地址:这里我们需要添加 passWord、empCode、service 三个参数其中 passWord 和 empCode 是从数据文件中提取出来的)。



9.右键[线程组]-[取样器]-[HTTP 请求](填写 CAS 登录请求地址:这里我们用到 username、password、lt、execution、_eventld 这 5 个参数其中 lt 和 execution 是第一个 cas 登录入口中通过正则提取出来的)。



10.右键[测试计划]-[添加]-[监听器]-[查看结果树]。



11.右键[测试计划]-[添加]-[监听器]-[聚合报告]。



12.在 HTTP 测试脚本录制下,填写代理服务器的端口:


a)Target Controller 修改为:“Test Plan>Thread Group>Recording Controller”;


b)Grouping 修改为:“Put each group in a new controller”。


13.设置完成后,可点击[启动],开始脚本录制。

3.结果说明


1.[view Resuls Tree]中可查看每个线程的运行情况,包括请求和返回两部分。绿色的代表线程运行成功,红色的代表线程运行失败


2.可在请求体中查看请求是否正确。



3.可在相应数据体中查看线程运行失败的原因,查看是否报错。



Sample:本次测试场景共运行了多少线程。


1.Average:平均响应时间。


2.Median:统计意义上的响应时间中值。


3.90% Line:所有线程中 90%的线程响应时间都小于 xx 的值。


4.Min:最小响应时间。


5.Maximum:最大响应时间。


6.Error:出错率。


7.Throughput:吞吐量。吞吐量以”requests/second、requests/minute、requests/hour”来衡量。

▎CAS 认证


CAS 认证是传统的 CAS 拦截认证,通过页面的强制拦截跳转,实现统一认证的效果,但是这种访问具有侵入性,非常不友好,并且一部分企业除了 IDM 本身的登录情况并没用到 CAS 的登陆认证。

1.认证流程



1.AuthenticationFilter:当用户访问应用时首先会被 AuthenticationFilter 拦截,判断 assertion 是否为空,如果为空会跳转到登录页面。


2.Cas20ProxyReceivingTicketValidationFilter:在登录页面输入用户名密码提交表单进行 CAS 认证返回 ticket 票据,被 Cas20ProxyReceivingTicketValidationFilter 拦截,通过 TicketValidator 中的 validate 方法校验 ticket 票据是否合法。


3.HttpServletRequestWrapperFilter:ticket 票据校验通过后 HttpServletRequestWrapperFilter 会将用户信息放到 AttributePrincipal 对象中,然后将 AttributePrincipal 对象放到 session 中。


4.XXXUserCasFilter:应用中扩展 UserCasFilter 拦截器,从 session 中获取 AttributePrincipal 对象实现登录认证过程。


5.CAS 认证报错原因主要为以下两方面


a)网络不通请求不到。


b)ticket 票据过期。

2.测试脚本


首先我们需要把线程数和循环次数以及 Ramp-Up 时间设置为 1 如下所示:



点击启动按钮进行脚本的测试。



点击查看结果树查看是否登陆失败等问题。


3.测试结果


1.CAS 认证 500 并发,5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 666.5,详情如下:



2.CAS 认证外网 1000 并发,5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 774.4,详情如下:



3.CAS 认证外网 1500 并发,5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 729.8,详情如下:



4.CAS 认证 2000 内网并发,5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 1506.5,详情如下:



5.CAS 认证 3000 内网并发,5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 1103.9,详情如下:


▎Oauth 认证


Oauth2.0 接口是 IDM 集团认证所用的接口,如果业务系统在进场时不需要子公司、分公司进行访问,那么他们可以进行这个接口的认证对接。所以在对接之前需要明确业务系统是通过哪种方式来与我们对接的。

1.认证流程



1.用户在访问业务系统登录时发起认证请求,通过 URL 跳转的方式请求 IDM 身份管理平台认证界面,传入 client_id、redirect_uri、response_type、state,IDM 根据参数返回 code 及 state;


注意:state 为状态位参数,请求系统在传递调用页面跳转时将 state 存储缓存中,后续调用请求是先判断 state 是否在缓存中已经存在,如果存在则为有效请求。


2.系统发起请求传入参数 client_id、client_secret、redirect_uri、grant_type 及 code(页面返回的 code),IDM 身份管理平台进行认证,返回 access_token。


3.系统根据获取的 access_token 触发 IDM 身份管理平台认证,IDM 认证成功后返回用户信息 Profile,返回至用户登录成功。

2.测试脚本


首先我们需要把线程数和循环次数以及 Ramp-Up 时间设置为 1 如下所示:



点击启动按钮进行脚本的测试。



我们点击察看结果树一个一个查看是否有出错的节点。


3.测试结果


1.Oauth 认证 500 并发 5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 2134.2,详情如下:



2.Oauth 认证 1000 并发 5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 2003.7,详情如下:



3.Oauth 认证 1500 并发 5 分钟,JMeter 聚合报告:异常率正常,平均值正常,吞吐量 1448.7,详情如下:


▎问题总结


一般来说性能调优有一个前提条件,就是可以让本身产品在正常运行下不会暴露出来的问题,通过这种压力测试的情况将问题扩大化、明显化,这种方式不仅是在为后续的工作排查问题,也能在排查调优的过程中发现产品的不足。

1.问题排查


当压测过程中出现问题时可以通过以下几个方面进行排查:


1.检查产品是否已经停止运行;


2.服务器的内存是否已经满载;


3.检查日志,报错信息是否记录到了日志中,针对于报错问题进行相关的排查;


4.如果在压测的过程中出现了问题但是服务器并没有崩溃,那么可以打开后台日志查看错误时的报错信息,针对于报错信息进行排查;


5.在压测过程中也可以检查 mysql,查看是否有 sql 堵塞的情况,根据堵塞问题进行处理和排查;


6.最后如果都没有问题可以看率减轻并发量,可能是已经达到了服务器的瓶颈。

2.压测调试


1.检查数据库的连接数配置;


2.产品中数据库的连接数调大,保证压测时并发执行的数据量;


3.IDM 的用户在线人数计算时间降低,保证在线人数的数量;


4.检查接口是否在对数据库进行读写,如果读写需要进行调整。

3.压测技巧


压力测试是有很多技巧的,例如本次的认证接口的压测,在压测过程中对日志表的读写量是非常大的,那么在每次重新测试时需要清空日志表,保证日志表的量,其次在压测过程中也要考虑到产品本身的使用情况、服务器的存储等等。由于是压测,所以这些东西涨起来是非常快的,可以在每次压测之前针对日志的记录及不必要的日志文件进行清除,保证服务器在一个优质的环境中运行。


1.实时查看 IDM 日志表,保证日志表的数据量。


2.调整产品日志写入级别。


3.数据库最大连接数和最小连接数调整。


4.对服务器参数进行优化。


5.清除没必要的压测日志记录。

▎心得总结


通过使用进行 JMeter 环境压测的过程中学到很多的知识也有了很多的感悟与认知,将自己的心得体会进行一下几个方面进行总结。

1.知识收获


JMeter 是一个比较强大的测试工具,可以便捷地为测试人员提供自动化测试脚本,减低人员的工作量,但是在业务环节、业务脚本创建、模拟的过程中需要经过全面的考虑、设计,需要针对不同业务场景进行测试设计,通过本次的压测学习中对 JMeter 有了新的认知,并了解了一些常用的组件并对其进行简单的应用。

2.意识形态


在新工具学习的时候首先要了解工具的用途,通过快速看、相关查的模式,迅速了解工具的使用说明及典型的应用场景;结合工具自身所带样例模式搭建,了解样例运行方式;自己进行基于样例的扩展或者自己学习配置使用,输出相关记录文档及学习心得,避免人工的大量投入及漏测、测错的情况。

3.能力提升


首先在工作中要拓宽自己的理论知识面,加强自己对理论知识的应用,在日常工作中,遇问题多查阅资料,熟悉相关知识,从而进一步的提高自己在工作中解决实际问题的能力。


努力提升业务素质和解决问题的能力,做到加强学习、更新观念,对待日常工作,不要总找借口,要从自身出发,不断加强学习更新观念,不断分析认识提高自己,改变不执行不作为的不良习惯,自动自发地做好本职工作。


在实际工作中,要更加积极主动地向领导请教遇到的问题,并多与同事们进行沟通,学习他们处理实际问题的方法及工作经验。通过多学、多问、多想来不断提高自己的实际工作能力。

发布于: 刚刚阅读数: 5
用户头像

agileai

关注

打造首选整合利器,共克异构集成难题 2022.05.16 加入

数通畅联致力于企业IT架构、SOA应用集成、数据治理分析领域。

评论

发布
暂无评论
JMeter集成底座项目压测心得_压力测试_agileai_InfoQ写作社区