JMeter线程组Duration参数真实含义是什么?为何与测试结果有偏差?
JMeter线程组Duration参数真实定义与生效逻辑
核心参数本质
Duration是线程组调度模式下的全局运行时长阈值,并非以单线程创建时刻、或手动点击测试启动的时刻为独立计算起点,它的计时基准完全和调度器的启动规则绑定:
- 若配置了
Startup delay,计时基准点 = 手动触发测试的时刻 + Startup delay的配置时长 - 若未配置
Startup delay,计时基准点 = 线程组正式开始执行ramp-up拉取线程的时刻 - 从这个基准点开始,经过你设置的Duration时长后,就到了整个测试的强制终止点,所有线程无论运行到什么状态、循环有没有跑完,都会被立刻停止。
观测矛盾的原因解释
你之前两次测试的结果看起来同时推翻了两种常见猜测,本质是没有把ramp-up阶段的时间占用规则算进去:
- 关于“Duration从单线程创建时刻开始计算”的猜测,为什么不成立:
要是真的按单线程的创建时间算1s的运行阈值,thread-50在09:46:13.232才启动,它自己的终止时间就应该是09:46:14.232,和1秒前启动的首个线程没有任何全局的时间约束,这和实际测到的“所有线程运行时长受统一阈值限制”的结果对不上。 - 关于“Duration从手动点击测试启动的时刻开始计算”的猜测,为什么不成立:
当线程数拉到1000个时,ramp-up阶段会花很长时间逐个拉起线程,这部分时间是直接算在Duration的计时额度里的。要是整个ramp-up过程本身就超过了设置的1s Duration值,那排在队列后面的线程被创建完成时,离全局强制终止点已经非常近了——它们刚发出首个HTTP请求,就会触发终止校验直接退出,不会继续跑循环。你看到的“最后几个线程请求时间和首个线程差超过1s”的现象,只是因为ramp-up把时间额度占满了,不是全局的Duration截止点变了。
具体生效的边界规则
- 只要到达「计时基准点 + Duration配置值」这个固定时间点,无论线程是在运行采样器、还是在ramp-up阶段排队等待创建,整个线程组都会立刻终止,不会额外延长运行时间。
- 每个线程每执行完一次循环操作,都会实时校验当前时间是否超过全局终止点,一旦超时,不管设置了多少次循环,都会直接退出线程。
- 若ramp-up时长超过Duration配置值,系统不会等所有线程都创建完成再停止,而是在到达终止点的瞬间,停掉所有正在运行的线程,未被创建的剩余线程会直接被丢弃。
内容的提问来源于stack exchange,提问作者YeKc1M
相关产品推荐
相关产品推荐

