Jmeter压测接口全流程详解
描述:内容包含Jmeter压测软件的安装、环境变量配置、具体实例参数的配置、动态参数构建、元件引入、函数引入、监控插件引入、在京东云上的引用等。
第一部分 Jmeter应用下载
一、Jmeter下载
进入官网:http://jmeter.apache.org/
1.进入官网
2.解压压缩包
3. Jmeter4.0版本,对应jdk1.8。
个人认为要注意3点:
1)解压之后压缩包叫apache-jmeter-4.0.zip,如是src.zip后缀的都不对,打开之后会报错不可用,因为里面缺少我们下一步将要配置的环境变量.jar文件。
2)对应的jdk版本不可太低,一般jmeter3.0的对应jdk1.7,jmeter4.0对应jdk1.8以上,否者启用jmeter也会报错。
3)一定要确保环境变量配置正确(包括jdk的与jmeter的环境变量配置)。
好了,接下来进行环境变量配置吧,因为是新手所以参照了大佬们的教程,我就根据自己的实际遇到的情况,总结一下来做备忘。
二、Jmeter环境变量配置
1.) 找到控制面板----》找到用户账户----》更改我的环境变量—》环境变量页面
2) 开始配置环境变量了。在系统变量框,点击“新建”,建立一个变量:JMETER_HOME,值为你解压的jmeter安装路径。我的安装路径是在E盘,这个路径根据自己实际安装路径进行填写。然后点击确定保存即可
3)配置classpath变量,没有的话也要按照上面步骤进行新建,有的话直接进行选中,点击编辑即可。变量值固定为:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar; 做完之后一定要保存,不确定的话可以直接点击确定按钮直到退到我的电脑页面
4)基本配置完成,然后验证一下是否配置正确,是否可用。
首先进到你的jmeter安装路径,找到bin文件夹,点击进去,找到jmeter.bat,鼠标右键用管理员方式运行,或者直接双击打开,此时会弹出2个界面:1.个是命令窗口,使用jmeter的时候此命令窗口不能关,你缩小到电脑任务栏即可。2.还有一个界面是jmeter工作页面,你可以在里面进行相关的操作.具体如图
5)确认安装是否成功,双击jmeter.bat或者以管理员方式运行,页面如下:
6)jmeter的工作区域如下:
我们每次使用jmeter的首先打开方式就是进入bin文件下双击这个jmeter.bat,如果觉得麻烦,可以鼠标右键快捷方式发送电脑桌面,就会方便很多。
7.安装结束。
第二部分 相关实例创建
一、添加本次测试计划
(右键–>添加–>Threads(Users)–>线程组)
2、设置线程数 (所谓线程数就是并发用户数)
3、添加协议及相关配置信息
4、为线程添加监听器
5、启动测试
6、查看报告
查看结果树。
聚合报告(可重点关注Throughout)。
图形结果
二、压测具体实例接口
1.动态参数
1.1 实例接口入参的固定格式如下方参数所示:
{
"supplierId": ${supplierId},
"product": {
"thirdSpuId": "${thirdSpuId}${__counter(false,id)}",
"sourceCategoryId":"${sourceCategoryId}",
"spuName": "${__counter(false,id)}${spuName}",
"customBrand": "${customBrand}",
"introduction": "${introduction}",
"appIntroduction": "${appIntroduction}",
"wxIntroduction": "${wxIntroduction}",
"afsServiceInfo": {
"refundService": ${refundService},
"refundDuration": ${refundDuration},
"changeService": ${changeService},
"changeDuration": ${changeDuration},
"repaireDuration": ${repaireDuration},
"specialDescYn": ${specialDescYn},
"specialDesc": "${specialDesc}"
},
"thirdSkus": [
{
"thirdSkuId": "${thirdSkuId}${__counter(false,id)}",
"skuName": "${__counter(false,id)}${skuName}",
"sellPrice": ${sellPrice},
"primaryImage": "${primaryImage}",
"otherImage": "${otherImage}",
"appPrimaryImage": "${appPrimaryImage}",
"appOtherImage": "${appOtherImage}",
"wxPrimaryImage": "${wxPrimaryImage}",
"wxOtherImage": "${wxOtherImage}",
"prdModel": "${prdModel}",
"packinglist": "${packinglist}",
"customAttributes": [
{
"name": "${name1}",
"value": "${value1}"
},
{
"name": "${name2}",
"value": "${value2}"
}
],
"modelCode": "${modelCode}"
}
]
}
}
1.2自增序列函数构建
增加自增函数可在当前线程组中多个HTTP请求中通过代码块引用其值。
说明:每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。
计数器使用一个整数值来记录,允许的最大值为2,147,483,647。
功能:这个函数是一个计数器,用于统计函数的使用次数,它从1开始,每调用这个函数一次它就会自动加1,它有两个参数,第一个参数是布尔型的,只能设置成 “TRUE”或者“FALSE”,如果是TRUE,那么每个用户有自己的计数器,可以用于统计每个线程歌执行了多少次。如果是FALSE,那就使用全局计 数器,可以统计出这次测试共运行了多少次。第二个参数是“函数名称”
格式:${__counter(FALSE,i)}
使用: 我们将"_counter"函数生成的参数复制到某个参数下面,如果为TRUE格式,则每个线程各自统计,最大数为循环数,如果为FALSE,则所有线程一起统计,最大数为线程数乘以循环数
1.3 HTTP 请求的创建
1.3.1 涉及
- 域名IP(也可是有效域名)
- 协议版本
- 协议名
- 接口形式Get/Post
- 参数的编码格式
1.4 CSV动态参数池构建
1.4.1 CSV元件
说明: 用以指定哪些参数需要从某一路径下的CSV文件中动态获取参数值。
1.4.2 CSV元件参数
1、元件参数配置
2、动态参数池文件
说明: 元件参数encoding设置了UTF-8后需要对引用的CSV文件格式进行校验
使用: 可在本地新建txt,将参数存储在txt中,以“,”隔开,保存的时候选择utf-8的编码格式。
描述:因为元件引用是csv格式文件还需要对TXT文本文件进行转码,右键当前参数文本–》点击通过记事本打开–》点击文件中的另存为而后指定新文件后缀名为csv同时变更其编码为UTF-8即可。
3、VOP发品接口
说明:
1、对于当前接口只关注 发送HTTP请求时,Lite业务系统给每个压测供应商提供的Token时效性(默认2小时,期间发起一次有效请求即可延长有效期)同时此Token参数引用使用TXT类型文件即可。
2、发送HTTP请求时的用户名accountName及对应accountId用户id此参数引用使用TXT类型文件即可
3、根据HTTP协议发送POST请求时需要对请求体的参数进行动态引用,但如果请求体中参数内容复杂且带有元件参数分隔符,会导致程序读取异常遂使用CSV文件程序按行读取即可。
*转成CSV可以更好观察,通过分隔符对参数切分是否正确。
1.5 HTTP头信息管理器
说明: 头信息中需考虑Token及参数编码格式及请求类型等前端参数其中后三项为定值,第一项Token为通过CSV元件从文件中动态取值点。(至于为何是此四项参数可参考后方链接)https://blog.csdn.net/lshxuexi/article/details/103125066
1.6 HTTP请求默认值
说明: 其中包含具体Vop推品请求URL参数,同时指定业务系统有效域名,以及路径上拼凑的非Body参数 此两项参数即上方用户名及用户ID,CSV元件(用户参数)的具体应用点。
1.7 监控元件
1.7.1 查看结果数
说明: 是对每一次请求的汇总展示框便于追踪其请求及响应值还可以通过取样器获取其中部分结果参数用以回填使用。
1.7.2 图形结果
说明: 压测时的整体参数可视化
1.7.3 聚合报告
说明: 聚合报告即压测过程结束时对每次请求及对整体请求的一次总结报告
1.7.4 聚合报告参数
描述:
结果树
取样器结果:返回值报200,表示执行接口调试成功
请求:发送的数据
响应数据:返回的数据
Thread Name:线程组名称
Sample Start: 启动开始时间
Load time:加载时长
Latency:等待时长
Size in bytes:发送的数据总大小
Headers size in bytes:发送数据的其余部分大小
Sample Count:发送统计
Error Count:交互错误统计
Response code:返回码
Response message:返回信息
Response headers:返回的头部信息
聚合报告
Label:HTTP Request name属性值。
Samples:测试的过程中一共发出了多少个请求即总线程数,(如果模拟10个用户,每个用户迭代10次,这里就显示100),对应图形报表中的样本数目。
Average:单个Request的平均响应时间,计算方法是总运行时间除以发送到服务器的总请求数,对应图形报表中的平均值。
Median:50%用户的响应时间。
90%Line:90%用户的响应时间。
Min:服务器响应的最短时间。
Max:服务器响应的最长时间。
Error%:本次测试中出错率,请求的数量/请求的总数。
Throughput:吞吐量,默认情况下表示每秒完成的请求数。
KB/Sec:每秒从服务器接收到的数据量,即每秒钟请求的字节数,时间单位均为ms。
图形结果
样本数目:总共发送到服务器的请求数。
最新样本:代表时间的数字,是服务器响应最后一个请求的时间。
吞吐量:服务器每分钟处理的请求数。
平均值:总运行时间除以发送到服务器的请求数。
中间值:有一半的服务器响应时间低于改值而另一半高于该值。
偏离:表示服务器响应时间变化、离散程度测量值的大小。
Question:
怎样计算Ramp-up period时间?
Ramp-up period是指每个请求发生的总时间间隔,单位是秒。如果Number of Threads设置为5,而Ramp-up period是10,那么每个请求之间的间隔就是10/5,也就是2秒。Ramp-up period设置为0,就是同时并发请求。
测试报告分析思路:
压测结果指标:
Samples:表示一共发出的请求数
Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms)
Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因
Throughput:简称TPS,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,TPS越高说明服务器处理能力越好
二、压测结果分析:
1)Error%:确认是否允许错误的发生或者错误率允许在多大的范围内;
2)Throughput:吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;
3)压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
4)最大的TPS:不断的增加并发数,加到TPS达到一定值开始出现下降,那么那个值就是最大的TPS。
5)最大的并发数:最大的并发数和最大的TPS是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
6)压测过程出现性能瓶颈,若压力机任务管理器查看到的CPU、网络和CPU都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。
7)影响性能考虑点包括:数据库、应用程序、中间件(tomcat、nginx)、网络和操作系统等方面。
三、性能测试关注点
客户端响应时间是否满足要求
服务器资源使用情况是否合理
应用服务器和数据库资源使用是否合理
最大访问数,最大业务处理量是多少
系统可能存在的瓶颈在哪里
能否支持7*24小时的业务访问
架构和数据库设计是否合理
内存和现成资源是否可以被正常回收
如果系统出现不稳定情况,其可恢复性如何
一般常识
CPU、TPS存在明显波动则存在瓶颈
并发时服务日志级别需调整为error级别
通常请求由一个线程负责执行,占用一个逻辑CPU
若并发量增加而CPU使用率未增加则存在瓶颈
CPU负荷集中在应用服务器和数据库服务器上
内存负荷集中在应用服务器和数据库服务器上
(CPU是负责运算和处理的,内存是交换数据的)
磁盘负荷集中在数据库/文件服务器上
对外网络流量集中在负荷均衡器(nginx、LVS)上
比如:
针对这个接口对500,800,1000,1500个线程(即用户)进行测试,Ramp-up period(in seconds)的值设为0,即同时并发请求,循环1次。
1、根据聚合报告以及图形结果各项参数指标分析
(1)每间隔一秒钟并发的线程数越多,接口99%Line参数值先增加后减小,1500个线程时基本达到峰值;
(2)每间隔一秒钟并发的线程数越多,吞吐量先减后增,每秒钟完成的请求数减幅较大。
2、根据图形结果分析
(1)随着发送到服务器的请求数越来越多,偏离数量越来越大,服务器越来越不稳定;
(2)发送到服务器的请求数增加,吞吐量(即服务器每分钟处理的服务器的请求)先减少后增加。
第三部分 Jmeter在京东云上的引用
第一步 找到性能测试
一、进入性能测试
二、创建测试脚本
三、从本地导入jmx脚本文件
说明: jmx脚本在jmeter可视化界面中构建参数完毕后,点击保存即可在jmeter的bin目录下自动构建jmx脚本文件,在导入时到该目录下将其引入到测试脚本中。
四、JMX脚本选取
五、参数池文件引入
说明: 将在Jmeter可视化界面中构建的CSV元件对应的参数池文件引入进来。
六、执行测试脚本
说明: 设置用户数(线程数)、持续时间(最小单位分钟)、预设QPS(吞吐量)
七、观察测试结果
描述: 可观察其并发数变化、吞吐量、采样数量、数据库压力、网络压力、CPU等指标。
八、观察跟踪日志
说明: 可观察每次请求的入参及出参数据
* 手动中断测试不会生成错误日志及跟踪日志,并会导致某些参数跟踪不完全。
九、导出测试报告
描述: 最终可选择将测试报告导出
十、测试报告
说明: 测试报告中有更全面的参数追踪结果。