什么是阶梯式压测?
阶梯式压测,就是对系统的压力呈现阶梯性增加的过程,每个阶段压力值都要增加一个数量值,最终达到一个预期值。然后保持该压力值,持续运行一段时间。实际上,阶梯式压测,是负载测试的一种通用方法。
为什么要阶梯式压测?
原因与负载测试是相同的。其目标是测试在一定负载情况下的系统性能,测试系统的不同负载情况下的性能指标。这种方法可以帮助我们,在最初无法预知服务器性能的情况下,迅速的得到一个极限值。在执行中,如果某个阶梯时间内Error率突然增加,那么这个阶段就是服务器的某个极限值。这种方法,要比我们不断地循环“设定并发值->执行->查看结果->调整并发值”这样一个迭代过程要方便的多。
【优势】
1. 逐步增加负载,减少系统压力突然增大导致系统崩溃的风险。
2. 可根据测试结果及时调整压测计划,有效的发现和解决系统性能问题;
Jmeter阶梯式压测方法
下载阶梯测试第三方插件
1. 下载阶梯测试的第三方插件包(下载地址:Install :: JMeter-Plugins.org)
2. 将下载下来的jar包放置在jemter文件的lib\ext下
3. 重启Jmeter,检查插件是否安装成功,打开jmeter,点击选项下的插件管理
Concurrency Thread Group阶梯压测
我们用到的就是这个Concurrency Thread Group。这个插件替代了之前的一个插件:Stepping Thread Group(已废弃),功能类似,不过使用上要更简单。安装步骤如图:
第一步:打开插件管理器
第二步:选择左侧Custom Thread Groups
第三步:点击右下的按钮进行安装
安装完成后,我们开始创建测试计划,并选择Concurrency Thread Group:
得到下图:
解释下参数设置:
Target Concurrency:目标并发数
Ramp Up Time:加速时间
Ramp-Up Steps Count:加速次数
Hold Target Rate Time:保持目标速率时间
Time Unit:时间单位
Thread Iterations Limit:线程迭代次数限制,即循环次数(空,即为一次)
Log Threads Status into File:将线程状态记录到文件中(保存日志文件);
以图中所示为例,首先Time Unit选择的是min(分),输入的数据为:
Target Concurrency: 50
Ramp up Time(min): 1
Ramp-up Steps Count: 5
Hold Target Rate Time(min): 1
Thread Iterations Limit: (空)
此用例场景为 ,在“Ramp up Time(min): ”1分钟的时间内,一共产生目标线程“Target Concurrency: ”50个;并且,分成“Ramp-up Steps Count: ”5个阶段来完成;在目标线程产生结束后,维持该线程生产速度“Hold Target Rate Time(min): ”1分钟;并且循环执行“Thread Iterations Limit: ”1次。over。
图中红色线条显示了单个循环内线程的产生概况,X轴为时间,共2min;Y轴为线程数,最高50条。5个阶梯显示出了线程的阶梯状分布。
实战截图:
Stepping Thread Group阶梯压测
解释下参数设置:
① 总线程数
② 等待10秒,这个时候还没有用户进入
③ 从第x个用户开始
④ 和 ⑤ 这里一起理解,添加50个用户,持续运行5分钟(间隔)
⑥ ramp-up,设置0,例如40个用户直接添加到50个用户,没有使用曲线添加。
设置10,10s启动,例如40个用户直接添加到50个用户,使用曲线添加;
⑦ 达到最大并发数时,持续压测时间
⑧ 和 ⑨,退用户,每10秒退出100个用户。
Ultimate Thread Group阶梯压测
解释下参数设置:
Start Threads Count:当前行启动的线程总数
Initial Delay/sec:延时启动当前行的线程,单位:秒
Startup Time/sec:启动当前行所有线程达峰值所需时间,单位:秒
Hold Load For/sec:当前行线程达到峰值后的稳定加载时间,单位:秒
Shutdown Time:停止当前行所有线程所需时间,单位:秒
上图含义:
第一个线程:没有延时,在10秒内启动100个线程数,到达100个后稳定运行60秒后,在再10秒内结束100个线程数。第二、第三线程同理。
根据以上描述可以计算两个阶段的拐点值。
测试结果分析
1. 通过jp@gc - Transactions per Second报告可以看失败的,当失败的比较多时,也有可能到了性能测试瓶颈了;也可以通过该报告分析TPS趋势。
2. 通过jp@gc - Transactions per Second报告和jp@gc - Active Threads Over Time报告分析,可以找到性能测试瓶颈时支持的最大并发量。
3. 通过jp@gc - Response Times Over Time报告,分析每个阶段的响应时间。
4. 通过汇总报告、聚合报告,分析响应时间、吞吐量是否符合预期。
5. 通过Grafana+Prometheus分析,CPU、内存、磁盘读写、磁盘IO、网络带宽、系统线程等是否满足预期结果。
阶梯式压测与普通压测区别
阶梯式压测聚合报告如下:
Active Threads Over Time如:
从“Active Threads Over Time”这个图里可以清楚看到,并发线程数量呈现出明显的阶梯形状。在不同的时间段内,服务器处在不同的压力级别当中。
那么阶梯式压测与普通的压测有什么区别呢?
先按照普通压测方式执行一次,查看结果。并发数据输入:
聚合报告如:
Active Threads Over Time如:
第一点不同,普通的压测方式,并发的线程数是可预知的;而阶梯压测是未知的。
普通压测,只要参数不变,每次结束后,#Samples一定是50x30=1500。而阶梯式压测,每次的并发数是变化的。我们现在依照上面给的参数,再进行2次压测。
第二次阶梯压测的聚合报告如:
第三次阶梯压测的聚合报告如:
第二点不同,”Active Threads Over Time”是不一样的。普通压测,线程只定义了初始产生的时间(50/秒,循环30次),而没有定义后续线程。每个线程在完成了自己的生命周期后,就结束了。而阶梯压测,会保持活跃线程在一个数值上,后续线程会持续产生。因此,在图中会出现不同。
可以得知:阶梯压测的方式与普通线程产生的方式是不一样的。
普通的压测方式,线程产生是固定的按照每秒X个线程的方式来产生,只在线程发出端做了限制。而阶梯压测的方式,是根据实际运行情况产生线程。一个线程,从请求发出,到服务器端处理,再到返回结果接收,才算完成一个完整的生命周期。阶梯压测方式,可以控制每个单位时间内的线程数。就像我们在Active Threads Over Time表格中看到的,在一段时间内,活跃的线程数量基本保持不变。可以这样想,当一个线程结束,总线程数-1,为保持活跃度,jmeter会立刻再产生一个线程上来维持数量,此时总线程数+1。
产生线程的间隔时间是根据压测中的实际运行状态来决定的。旧的线程结束的快,新的线程产生的就快。因此,每次阶梯压测的结果,总线程数都不一样,因为每次压测负载机和服务器机的状态都不一样。