JMeter:能否通过Groovy/BeanShell实现每秒目标吞吐量设置?
在JMeter中通过Groovy/BeanShell实现恒定吞吐量控制
当然可以通过Groovy或BeanShell脚本实现每秒目标吞吐量的控制,以下是具体实现方案:
一、Groovy实现(推荐,性能更优)
使用JSR223定时器,选择Groovy语言编写脚本,通过计算请求间隔时间来控制吞吐量:
// 设置目标吞吐量(每秒请求数) def targetThroughput = 10 // 计算理论间隔时间(毫秒) def interval = 1000 / targetThroughput // 获取上次请求结束时间(首次执行时默认当前时间) def lastExecutionTime = vars.getObject("lastExecutionTime") ?: System.currentTimeMillis() def currentTime = System.currentTimeMillis() // 计算需要等待的时间:理论间隔减去从上次执行到现在的耗时 def waitTime = interval - (currentTime - lastExecutionTime) // 若仍需等待,则执行睡眠 if (waitTime > 0) { sleep(waitTime) } // 更新上次执行时间为当前时间(等待完成后的时间) vars.putObject("lastExecutionTime", System.currentTimeMillis())
说明:
- 将该脚本放入JSR223定时器中,绑定到需要控制吞吐量的请求组上
vars是JMeter内置变量对象,用于跨请求存储上次执行时间- 可通过JMeter参数化变量动态调整吞吐量,比如替换
10为${__P(target.throughput,10)},方便在命令行或配置文件中修改
二、BeanShell实现(兼容旧版本,性能较弱)
使用BeanShell定时器编写逻辑,语法接近Java,但高并发场景下性能不如Groovy:
// 设置目标吞吐量(每秒请求数) int targetThroughput = 10; long interval = 1000 / targetThroughput; // 获取上次执行时间 Long lastExecutionTime = (Long)vars.getObject("lastExecutionTime"); if (lastExecutionTime == null) { lastExecutionTime = System.currentTimeMillis(); } long currentTime = System.currentTimeMillis(); // 计算等待时间 long waitTime = interval - (currentTime - lastExecutionTime); // 执行睡眠(处理中断异常) if (waitTime > 0) { try { Thread.sleep(waitTime); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } // 更新上次执行时间 vars.putObject("lastExecutionTime", System.currentTimeMillis());
注意事项:
- 优先选择Groovy:JMeter 3.1及以上版本官方推荐JSR223+Groovy组合,性能远高于BeanShell
- 处理长耗时请求:如果请求本身执行时间超过计算出的间隔时间,实际吞吐量会低于目标值,此时需要调整线程数或优化请求性能
- 动态调整:可结合JMeter属性或变量实现运行时动态修改吞吐量
内容的提问来源于stack exchange,提问作者POTL12345
相关产品推荐
相关产品推荐

