JMeter大量采样器场景下如何通过Throughput Controller实现请求等频次发送
JMeter多采样器请求数均等配置解决方案
问题核心根因
JMeter线程默认串行执行所属子节点,单线程单次循环会按顺序跑完所有100个采样器后才会进入下一轮循环。当测试总时长不足以支撑所有线程完成多轮全量采样器执行时,排序靠后的采样器会分配不到执行机会,最终出现请求数差异极大的情况。
可行配置方案
方案1:交替控制器(Interleaving Controller)实现轮询执行(最便捷)
这是实现100个采样器请求数差值不超过1的最优方案,配置步骤如下:
- 移除原有直接挂在Ultimate Thread Group下的所有采样器
- 右键Ultimate Thread Group添加 → 逻辑控制器 → 交替控制器
- 将sampler1到sampler100全部放到交替控制器下
- 按需在交替控制器外层添加循环控制器(如果需要控制总迭代次数)
- 原理:每个线程每次进入交替控制器时,只会按顺序执行1个采样器,下一次进入时执行下一个,所有采样器轮询分配执行机会,天然保证请求数均等。
方案2:吞吐量控制器(Throughput Controller)按比例分配(适合灵活调整占比)
你之前使用吞吐量控制器未生效是因为配置逻辑错误,正确配置如下:
- 每个采样器单独挂载1个吞吐量控制器,不要把所有采样器放到同一个吞吐量控制器下
- 所有吞吐量控制器的执行模式选择
Percent Executions(执行百分比),每个控制器的吞吐量值设为1.0(100个采样器各占1%) - 所有吞吐量控制器勾选
Per User(按线程统计)选项 - 外层添加循环控制器,保证总循环次数足够覆盖所有采样器的执行需求
方案3:JSR223采样器动态分发(适合自定义规则场景)
如果需要更灵活的分发逻辑,可通过代码实现:
- 右键Ultimate Thread Group添加 → 采样器 → JSR223 Sampler
- 将所有sampler1到sampler100设为禁用状态(右键选择Disable)
- 在JSR223 Sampler中写入如下Groovy代码:
// 初始化线程安全计数器 def counter = ctx.getThreadGroup().getPropertyAsInt("samplerCounter", 0) counter = (counter + 1) % 100 ctx.getThreadGroup().setProperty("samplerCounter", counter) // 执行对应索引的采样器 def targetSampler = ctx.getThreadGroup().findTestElementByName("sampler" + (counter + 1)) targetSampler.sample(null)
- 该方案可以精准控制每个采样器的执行顺序和次数,理论误差为0。
额外优化建议
- 如果测试场景允许,可将ramp up时间适当调长,避免启动阶段线程资源不均导致的少量误差
- 若需要严格保证总请求数相等,建议用循环控制器固定总迭代次数,而非依赖运行时长控制测试结束
内容的提问来源于stack exchange,提问作者Beklevir
相关产品推荐
相关产品推荐

