分布式JMeter测试:线程同步启动致系统冲击,Uniform Random Timer无效求助
问题原因分析
Once Only Controller里的Uniform Random Timer是每个线程启动后立即执行,但你所有160个线程是从Master同时触发启动的,所以每个线程的等待是同步开始的——哪怕设置了随机时长,所有线程的等待周期是同时启动的,最终还是会在差不多同一时间结束等待、发起第一个请求,自然没法错开线程的首次请求时间。
优化方案
- 调整线程组的启动延迟(Ramp-Up Period):别把线程组的Ramp-Up设为0,比如160个线程可以设30-60秒,让JMeter在这段时间里逐步启动所有线程。分布式场景下,这个设置是Master全局控制的,会均匀分配到各个slave节点的线程上,从根源避免瞬间启动的问题。
- 用Setup Thread Group做前置延迟:在测试计划里加一个Setup Thread Group,里面放Uniform Random Timer和Test Action采样器(空操作就行)。Setup Thread Group会在主线程组启动前执行,每个slave的Setup线程先随机等一段时间,再启动主线程组的线程,这样各个slave的主线程启动时间就会错开。
- 给slave启动加随机延迟:如果是命令行启动jmeter-server,给每个slave的启动命令前加随机睡眠,比如Linux下用
sleep $((RANDOM%30)),让各个slave不是同时就绪,Master分发线程时自然就会错开启动节奏。 - 用调度器配合随机启动时间:打开线程组的调度器,用
__Random(0,60)函数生成启动时间的偏移量,让每个线程组的启动时间有随机延迟,不过这种方式适合提前脚本化配置的场景。
内容的提问来源于stack exchange,提问作者Kalydrae
相关产品推荐
相关产品推荐

