集合点含义:
集合点可以简单得理解为一种控制虚拟用户行为的机制,该机制可以达到在一定时间范围内将一定数量的虚拟用户阻挡在一个操作行为点前的位置进行互相等待,在条件(达到虚拟用户数量或超时)到达后唤醒全部等待中的虚拟用户,从而达到使得一定数量的虚拟用户可以同时进入下一个操作行为点的目的。
往往其使用初衷是为了实现最大意义上的并发来考察系统应对此种极端情况的表现。
JMeter中所提供的SyncTimer(同步计时器),就是内部利用CyclicBarrier来控制阻塞和释放全部运行线程的逻辑行为,从而达到“集合点”的目的
正确使用集合点:
首先,不是特别建议你在测试场景的设计中加入集合点,实际上在忽略ThinkTime和KeyTime的情况下,已经可以叫并发测试了,而且效果也完全达到了预期。
如果想使用集合点,你要有十分充足的需求作为导向。另外,建议将大事务拆解为更加短小精悍的几个小事务,并且通过分组运行调节这些事务之间的关系,比如一个组可以跑整个大事务或一些组按事务混合比跑其中几个小事务串儿作为持续不断的压力背景,在这种情况下精选几个关键性业务下的事务组合放入集合点,一个一个的在压力背景环境下下运行测试,重点关注它们的真正并发表现。
集合点的一些其他用途:
(1)处理业务流或数据流上下游关系
当业务流或数据流继承关系要求耦合性非常高时,比如下游所需要处理的业务或数据必须依赖于上游所有或一定量用户完成相应业务处理或产生数据的基础上,可以利用集合点达到正确处理这类关系的效果。
(2)流控
当配合一些逻辑判断脚本或工具组件时,通过判断是否在一些特殊条件满足的情况下启动集合点,可以达到用户流量控制的效果。
注意:
1.JMeter里面的集合点通过添加定时器来完成。
2.Synchronizing timer仅作用于同一个JVM中的线程,因此在分布式压测中是失效的。
集合点
1) 启动路径
2)用法
Number of Simulated Users to Group by:集合多少人后再执行请求(也就是执行的线程数)
注意:等同于设置为线程租中的线程数,一定要确保设置的值不大于它所在线程组包含的用户数。
Timeout in milliseconds:指定人数 多少秒没集合到算超时(设置延迟时间以毫秒为单位)
注意:如果设置Timeout in milliseconds为0,表示无超时时间,会一直等下去。
线程数量无法达到"Number of Simultaneous Users to Group by"中设置的值,那么Test将无限等待,除非手动终止。
3)如果希望定时器仅应用于其中一个sampler,则把该定时器作为子节点加入,如下图
定时器仅仅对HTTP请求1起作用,即仅在HTTP请求1执行前执行定时器,和HTTP请求2无关。
3)如果你希望synchronizing timer应用于多个sampler.
如下,执行HTTP请求1和HTTP请求2前都会执行同步定时器1、2。当执行一个sampler之前时,和sampler处于相同作用域的定时器都会被执行;
注意点:
-----集合点的位置一定要在Sample(采样器)之前才能生效吗???”
在Jmeter中,timer是在sampler之前执行的。不管这个定时器的位置放在sampler之后,还是之前。当然,如果有多个timer的时候,在相同作用域下,会按上下顺序执行timer,这个就需要慎重放置timer的顺序;不过,为了更好的可读性,还是建议将timer放在对应的sampler前面 或 子节点中;
5) 进行必要设置后,运行查看效果,通过结果树可以看到,请求是批量执行的。
可以观察开始执行的脚本,观察请求的增加数量趋势;或对比请求的发送时间.
补充: Synchronizing timer 仅作用于同一个JVM中的线程。
试想:
a.如果分布式测试时,synchronizing timer作用于所有jvm,那么jvm之间或者说监控jvm工作的部件就需要频繁通讯,确定线程的数量及状态等,然后集结了足够的线程后,又要发送信号让Jmeter来发送测试请求,中间存在延时,这样就无法模拟更真实的高并发了,而且这个东西还会消耗测试机器的一部分性能,会给测试结果带来负面影响;所以暂时是只支持控制单个jvm,如果后面有办法解决上面那些问题后,就可以实现控制多个jvm,控制总并发量;
b.如果分布式测试,并使用了Synchronizing timer,且设置的值是小于单个jvm的线程数量;但是,较难确保所有jvm都在同一时间点集结了同样数量的线程数,这样就很难下测试结论了,因为都不知道是多少并发下的性能表现;当然了,可以将线程的启用时间拉长,并将超时时间延长,这样就很可能会与同一时刻集结到足够的线程,达到超高并发的测试;所以,分布式测试与Synchronizing timer一般不是同时使用的;如果非要用,则需要慎重设置相关参数
部分原文链接:https://blog.csdn.net/zjq001x/java/article/details/53107159