使用属性文件配置Throughput Shaping Timer时JMeter线程组提前停止问题
问题根因
日志里的No further RPS schedule说明Throughput Shaping Timer(简称TST)的吞吐量调度计划已执行完毕,它会主动触发测试停止——哪怕你在属性文件里设置了18000秒(5小时)的总时长。大概率是TST的各阶段调度时长总和没覆盖满5小时,或是调度配置和线程组的时长控制逻辑冲突了。
具体修复步骤
1. 核对TST各阶段时长总和
打开TST配置界面,把所有阶段的Duration(持续时间)加总,确认总和是否等于18000秒。如果总和小于5小时,最后一个阶段跑完后,TST就会叫停测试。比如设置了“热身10分钟+稳定4小时”,加起来仅4小时10分,剩余50分钟无调度计划,自然会提前终止。
2. 用属性变量统一计算时长
别手动输入各阶段时长,直接用属性文件里的duration变量推导,避免计算错误:
- 热身阶段时长填:
${__P(warmup.duration, 600)}(默认10分钟) - 稳定阶段时长填:
${__javaScript(${__P(duration, 18000)} - ${__P(warmup.duration, 600)} - ${__P(cooldown.duration, 600)},)} - 冷却阶段时长填:
${__P(cooldown.duration, 600)}(默认10分钟)
这样不管duration设为多少,各阶段时长总和始终等于总时长,不会出现调度断档。
3. 关闭TST的自动停止功能
如果测试时长由线程组控制,进入TST的「Advanced」标签页,取消勾选Stop test when done选项。这样即使TST的调度执行完毕,测试也会继续至线程组设置的时长结束。
注意:需配合线程组配置——第三个线程组要勾选
Forever循环,再在「Scheduler」里把Duration设为${__P(duration, 18000)},让线程组把控停止时间。
4. 检查线程组的循环与调度配置
第三个线程组的循环次数千万别设固定值,一定要勾选Forever,否则线程跑完固定循环数就会停止,与时长设置无关。同时开启线程组的「Scheduler」,将Duration设为属性文件中的变量,确保线程组运行满指定时长。
5. 验证配置正确性
在测试计划中添加一个JSR223 Sampler,输出各阶段时长到日志,确认总和无误:
def total = Integer.parseInt(props.get('duration', '18000')) def warmup = Integer.parseInt(props.get('warmup.duration', '600')) def cooldown = Integer.parseInt(props.get('cooldown.duration', '600')) def steady = total - warmup - cooldown log.info("总时长: ${total}秒 | 热身: ${warmup}秒 | 稳定: ${steady}秒 | 冷却: ${cooldown}秒")
运行前查看日志,确认时长总和为18000秒,避免配置错误。
总结
核心是让TST的调度时长覆盖整个测试周期,或是将测试停止控制权交给线程组,避免TST中途叫停。按上述步骤调整,即可确保测试稳定跑满5小时。
内容的提问来源于stack exchange,提问作者SAIR

