JMeter中的常数吞吐量定时器与用于控制思考时间的定时器,两者完全不同。
常数吞吐量定时器:相当于一个流量闸门,测试整体发出的总请求量(比如每秒多少个请求),会动态调整线程之间的等待时间,把整个测试的吞吐量稳定在设定的数值上。
思考时间定时器:是一个用户行为模拟器,在每个取样器执行之前插入一段延迟,让虚拟用户的两次操作之间产生停顿,模仿真实用户浏览、输入、思考的节奏。
一、差异
① 目标
常数吞吐量定时器:控制吞吐量,维持稳定的请求发送速率。
思考时间定时器:模拟用户思考时间,在请求间插入延迟。
② 控制粒度
常数吞吐量定时器:作用于整个测试或线程组,属于宏观调控。
思考时间定时器:作用于单个用户(线程)的每次操作,属于微观调控。
③ 工作原理
常数吞吐量定时器:根据已发出的请求耗时,动态计算下一次需要等待的时长,让实际吞吐量向目标值靠拢。
思考时间定时器:在每个取样器之前,直接加入一个固定的或随机生成的延迟,不关心吞吐量。
④ 参数
常数吞吐量定时器:Target throughput(单位是样本数/分钟)。
思考时间定时器:Thread Delay(单位是毫秒)。
⑤ 应用场景
常数吞吐量定时器:负载测试、容量规划,需要向服务器施加恒定压力。
思考时间定时器:模拟真实用户行为,让测试负载更贴近现实。
二、常数吞吐量定时器
这个定时器会计算并插入动态延迟,使得整体吞吐量逼近你设定的样本数/分钟。
配置:
目标吞吐量:数值要转换成每分钟量级,例如想达到每秒1个请求,就填60。
计算模式(Calculate Throughput based on):
this thread only:每个线程各自独立达到该吞吐量,总吞吐量 = 设定值 × 线程数,容易超预期,除非特殊场景,否则不推荐。
all active threads in current thread group(推荐):将目标吞吐量分摊给当前线程组中的所有活跃线程。
all active threads:分摊给所有线程组的所有活跃线程。
带shared的选项会让线程共享一个上次运行时间,能更精准地控制全局事务率;不带 shared 则更注重线程间的均匀分布。通常选用非 shared 的 all active threads in current thread group 即可。
工作原理简述:
它不断计算上一次请求耗时,如果请求太快,就多等一会儿;如果请求太慢,就少等一会儿,甚至不等。公式为:等待时间 = (60 / 目标吞吐量) - 上一次请求间隔。
常见误区:
设定目标不代表一定能达到,实际吞吐量还受服务器性能、网络等限制。
如果线程数太少,即使不等待也可能达不到目标吞吐量,需要增加线程数。
一个作用域内不要放置多个常数吞吐量定时器,否则等待时间会叠加,效果紊乱。
定时器的作用域要清晰:放在线程组下影响全局,放在某个取样器下只影响该取样器。
三、思考时间控制
思考时间是为了让测试更像真实用户,避免请求像机关枪一样扫射。JMeter 提供了几种不同的定时器来实现:
固定定时器:最简单,为每个取样器之前增加一个固定的毫秒数延迟。优点是可控,缺点是不够自然。
统一随机定时器:总延迟 = 固定延迟偏移+ 一个在 0 到 随机延迟最大值之间均匀分布的随机值,能产生变化的间隔。
高斯随机定时器:总延迟 = 固定延迟偏移 + 一个符合正态分布的随机值,大多数用户的思考时间会集中在平均值附近,更符合自然规律。
四、建议
两者各司其职:常数吞吐量定时器管宏观压力,思考时间定时器管微观节奏,不要混为一谈。
组合使用效果更佳:在模拟真实负载时,先用固定定时器(或随机定时器)在每个操作间加入思考时间,再用常数吞吐量定时器从整体上锁住目标吞吐量,这样既真实又可控。
正确配置是关键:常数吞吐量定时器优先选用 all active threads in current thread group 模式;思考时间根据用户行为的随机性需求,选择固定、均匀随机或高斯随机定时器。