JMeter如何在性能测试全程保持恒定RPS请求速率?
JMeter实现恒定RPS负载测试的方案
你目前使用的Constant Throughput Timer是基于过往请求的吞吐量动态计算延迟,会受被测服务响应速度影响,无法实现硬恒定的请求发送速率,可通过以下方式实现全程稳定RPS:
方案1:使用Precise Throughput Timer(推荐,JMeter 5.2及以上版本自带)
该定时器专门设计用于输出不受服务响应影响的恒定吞吐量,配置逻辑如下:
- 替换你现有测试计划中的
Constant Throughput Timer为Precise Throughput Timer - 核心参数配置:
- 目标吞吐量:填
40(单位为请求/秒) - 吞吐量持续时间:填
600(对应10分钟) - 计算模式选择「所有活跃线程(全局共享)」
- 目标吞吐量:填
- 注意调整线程数变量
${threadnum}的取值,公式为目标RPS * 服务最大预期响应时间(秒),比如40RPS、服务最大响应2秒的场景,至少要配置80线程,避免线程不足导致无法达到目标发送速率。
方案2:JSR223 Timer自定义控制(兼容低版本JMeter)
如果使用的JMeter版本低于5.2,可添加JSR223 Timer,填入以下Groovy代码实现恒定RPS控制:
// 全局存储上次请求发送时间,仅初始化1次 if (props.get("lastSendTime") == null) { props.put("lastSendTime", System.currentTimeMillis()) } // 40RPS对应单请求间隔为1000/40=25ms def interval = 25 def now = System.currentTimeMillis() def passed = now - props.get("lastSendTime") def delay = interval - passed if (delay > 0) { sleep(delay) } props.put("lastSendTime", now + Math.max(delay, 0))
现有测试计划调整说明
你当前的jmx配置中其余部分无需修改:
- 循环控制器设置为
-1(永久循环)符合要求 - 调度器开启后
${duration}参数填600即可控制测试总时长为10分钟 - 测试过程中可通过Summary Report监听器查看每秒请求数统计,正常情况下RPS误差可控制在5%以内。
内容的提问来源于stack exchange,提问作者user782400
相关产品推荐
相关产品推荐

