You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());

注意事项:

  1. 优先选择Groovy:JMeter 3.1及以上版本官方推荐JSR223+Groovy组合,性能远高于BeanShell
  2. 处理长耗时请求:如果请求本身执行时间超过计算出的间隔时间,实际吞吐量会低于目标值,此时需要调整线程数或优化请求性能
  3. 动态调整:可结合JMeter属性或变量实现运行时动态修改吞吐量

内容的提问来源于stack exchange,提问作者POTL12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:10:17