jmete并发数控制
2022-04-28 09:49 youxin 阅读(653) 评论(0) 编辑 收藏 举报场景描述:系统需要登录,提交申请单;现在需要每秒提交3个申请单,持续5分钟;
1. 先解释一下Jmeter几个参数:
线程组:我们直接可以理解为多少个用户—— 一般和你的并发数相等
Ramp-ups 时间:规定时间的跑完所有请求
循环次数:线程组循环多少次——你设置线程组为5,循环 10 次,就会有50 个请求
如图上我所设置的,Ramp-up 时间为 1,他就会 1s 内,跑完所有所有请求。这样是控制的样本数
调度器:如果求压测10分钟或者半小时,怎么办?
第二种压测方式,使用调度器设置持续时间,控制压测的时间(样本数不是固定的)
- 勾选永远
- 勾选调度器
- 持续时间设置(单位秒)
3. 按照需求,需要每秒提交3个申请单,持续5分钟;设置如下,
HTTP请求下添加定时器
但是经过测试,并不是每秒发送3个请求;
这里使用 准确的吞吐量定时器,这个定时器能控制并发,添加在接口下面,如图
作用:和Constant Throughput Timer类似,但是能更精准的控制请求。区别就是Constant Throughput Timer根据时间来做定时器(到了多少秒就发请求);Precise Throughput Timer是根据吞吐量在做计时器(到了多少量就发请求)。也就是能做到控制请求的速度和个数。
————————————————
一、误区
在JMeter压测过程中,我们通常认为1s内100的并发量(即:QPS为100)的设置如下:
线程组-线程数:100;Ramp-Up时间(秒):1;循环次数:勾选永远
没有再添加额外的控制器。上述中的参数设置解释:
线程数: 启用的并发线程个数
Ramp-Up时间(秒):在多少秒之内将上述并发的线程启动起来
循环:控制循环次数
说明:
一个常见的误解,认为线程数设置为100,Ramp-Up时间(秒)设置为1,就是每秒发起100个请求量。
上述的设置,表示在1s内启动100个线程,之后,jmeter便以最大限度的100个并发进行压测,不能保证1s内只有100个请求。
我们用上述的设置,对某个接口进行压测,发现:
在一秒内,发起的请求居然有五百多个,与实际想要的1s发起100个并发是有差别的。
二、控制并发数
添加Constant Throughput Timer(常数吞吐量定时器),该定时器可以方便地控制给定的取样器发送请求的吞吐量。
Target throughput(in samples per minute)设置:6000(由于单位是一分钟,如果要求QPS为100,则该值设置为60*100=6000)
Calculate Throughput based on设置:all active threads
例如:jmeter脚本有两个接口,每个接口TPS=50
Calculate Throughput based on的选项有5个,分别是:
This thread only:控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的target Throughput 乘以改线程的数量。
all active threads:设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上次运行结束后等待合理的时间再次运行。活跃线程指同一时刻同时运行的线程。
all active threads in current thread group:设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程时,改选项和all active threads选项的效果完全相同。
all active threads(shared):与all active threads的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上运行一次结束后等待合理的时间后再次运行。
all active threads in current thread group(shared):与all active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间再次运行。
当然,Constant Throughput Timer只有在线程组中的线程产生足够多的request 的情况下才有意义,因此,即使设置了Constant Throughput Timer的值,也可能由于线程组中的线程数量不够,或是定时器设置不合理等原因导致总体的QPS不能达到预期目标。
比如线程数10,时间是5秒,循环2次,也就是说,一秒会执行两个线程*2次循环,一秒并发4次请求
假设线程数为100个,花费时间20s,那么每秒启动的线程数 = 线程数/时间,即100/20 = 5。换句话说,就是1秒启动5个线程。
————————————————
参考:https://blog.csdn.net/yiwenrong/article/details/121471293
https://blog.csdn.net/qq_33362684/article/details/119911811