如何用JMeter实现100虚拟用户分5批访问URL以获取不同吞吐量?
嘿,这个需求其实用JMeter的几个核心组件组合就能搞定,我给你拆解成两种实现方式,一种用原生组件(不用装插件),一种用插件更省心,你按需选:
方法一:用JMeter原生组件实现(无插件依赖)
1. 先配置基础线程组
新建一个线程组,参数这么设:
- 线程数:100(总虚拟用户数,刚好5批×20个)
- Ramp-Up时间:0(让所有线程瞬间创建,但我们会用定时器控制它们的实际启动时机)
- 循环次数:根据你的测试需求设置(比如1次,或者循环到测试结束)
2. 用JSR223定时器实现分批次延迟启动
要让20个一批、间隔一段时间启动,我们可以给每个线程计算它所属的批次,然后设置对应延迟:
- 在线程组下添加JSR223定时器,把下面的Groovy脚本粘进去(记得勾选「Compile script」提升性能):
// 获取当前线程的编号(JMeter线程从0开始,所以+1转成1-100的编号) def threadNum = ctx.getThreadNum() + 1 // 计算所属批次:每20个一批,批次从0开始 def batch = (threadNum - 1).intdiv(20) // 设置每批之间的间隔时间(这里设30秒,你可以改成自己需要的毫秒数) def interval = 30000 // 计算当前线程的延迟时间:批次×间隔 def delay = batch * interval // 给当前线程设置延迟 ctx.getSampler().delay(delay)
这样第一批(1-20号线程)延迟0秒立即执行,第二批(21-40)延迟30秒,第三批延迟60秒……完美实现分5批启动。
3. 给每批设置不同吞吐量
接下来用吞吐量控制器配合前置处理器,让每批线程按不同速率发请求:
- 在线程组下添加5个吞吐量控制器,每个对应一批线程:
- 第一个控制器(对应第一批):
- 先加个JSR223前置处理器,脚本用来判断当前线程是否属于第一批:
def threadNum = ctx.getThreadNum() + 1 vars.put("isBatch1", threadNum <= 20 ? "true" : "false") - 回到吞吐量控制器,勾选「使用变量」,变量名填
isBatch1,然后设置你想要的第一批吞吐量(比如选「每秒请求数」,填10)。
- 先加个JSR223前置处理器,脚本用来判断当前线程是否属于第一批:
- 第二个控制器(对应第二批):
- 前置处理器脚本改成判断
threadNum >20 && threadNum <=40,变量名设为isBatch2,然后设置第二批的吞吐量。
- 前置处理器脚本改成判断
- 剩下三个控制器以此类推,分别对应3-5批线程,设置各自的吞吐量。
- 第一个控制器(对应第一批):
- 最后,在每个吞吐量控制器下面,添加你的HTTP请求(目标URL),这样不同批次的线程就会按各自的速率访问目标了。
方法二:用JMeter插件实现(更直观省心)
如果你装了JMeter插件管理器,推荐用步进线程组+吞吐量整形定时器,配置起来更可视化:
1. 先装必要插件
打开JMeter插件管理器,搜索并安装:
Stepping Thread Group(用来分批次启动线程)Throughput Shaping Timer(用来控制不同时间段的吞吐量)
2. 配置Stepping Thread Group
新建一个Stepping Thread Group,参数这么填:
- Initial Delay:0(测试开始后立即启动第一批)
- Startup Time:0(每批的20个线程瞬间启动)
- Hold Load For:每批线程的持续时间(比如60秒,按需调整)
- Shutdown Time:0(线程结束时立即关闭)
- 在「Steps」区域添加5步:
(这里的Delay before step是批与批之间的间隔,30000就是30秒,按需改)Step Threads Duration Delay before step 1 20 60 0 2 20 60 30000 3 20 60 30000 4 20 60 30000 5 20 60 30000
3. 配置Throughput Shaping Timer
添加Throughput Shaping Timer,在「Load Profile」里设置5个时间段,对应每批的运行时间和吞吐量:
- 比如第一批运行时间是0-60秒,吞吐量设为10;
- 第二批是60+30=90秒到90+60=150秒,吞吐量设为15;
- 第三批是150+30=180秒到180+60=240秒,吞吐量设为20;
- 以此类推,每个时间段对应一批的运行窗口,设置对应的吞吐量即可。
小提示
- 用原生组件时,记得JSR223脚本尽量用Groovy,性能比其他脚本语言好;
- 吞吐量的单位要注意:吞吐量控制器里可以选「每秒请求数」「每分钟请求数」或者百分比,别选错了;
- 测试前可以先跑个小批量验证,比如把总线程数改成10(2批×5个),看看延迟和吞吐量是否符合预期。
内容的提问来源于stack exchange,提问作者NaveenChandrasekaran




