场景:并发
你们在使用Jmeter测试的时候应该发现了,jvm
(1)线程启动了就会直接发送测试请求;--若是要模拟在一瞬间高并发量测试的时候,须要调高线程数量,这很耗测试机器的性能,每每没法支持较大的并发数,没法控制每次测试的瞬间并发量;分布式
(2)若是使用了constant throughput timer,能够模拟较长时间的并发测试,可是仍没法知足稳定的瞬间高并发测试;ide
解决:高并发
一、使用集合点;性能
做用:阻塞线程,直到指定的线程数量到达后,再一块儿释放,能够瞬间产生很大的压力。学习
引用虫师的话“红军排长说:等一等!集结了全部战友后,你们再一块儿冲啊!这样给敌人的压力是最大的。”
测试
操做步骤
spa
一、添加集合点,在Jmeter里是synchronized timer;.net
二、面板说明及设置
(1)面板说明
1)名称:自定义名称
2)Number of Simulated Users to Group by
Define how many simulated users trigger the release of the synchronizing block(default value of '0'means all users).
即a.每集合够多少个模拟用户(线程)后发送一次测试请求;
b.若是设置为0,等同于设置为线程租中的线程数;
c.确保设置的值不大于它所在线程组包含的用户数(线程数)-- 一直集结线程而不发出测试请求,直到超时(若是设置了的话)。
例子说明:“Number of Simulated Users to Group by: 5”表示并发量是5。也就是说,Jmeter会等到5个线程都运行到此处时,这五个线程才开始执行后面的操做,先到达的线程将会在此等候。
3)Timeout in milliseconds
If set to 0,no timeout will occur;if superior to 0,then if after the timeout interval the number of users waiting is not reached,timer will stop waiting.
即a.超时时间,即多少毫秒后同时释放已集结的的线程,发送测试请求;
b.若是设置为0,Timer将等待线程数达到了"Number of Simultaneous Users to Group"中设置的值才释放。若是大于0,那么若是超过Timeout in milliseconds中设置的最大等待时间(毫秒为单位)后还没达到"Number of Simultaneous Users to Group"中设置的值,Timer将再也不等待,释放已到达的线程。
(2)设置
咱们这里设置Number of Simulated Users to Group by :10
Timeout in milliseconds :500
三、设置线程组属性
由于如今是使用集合点来实现高并发测试,因此如今线程组属性中就能够设置线程在较长的时间来启动,这样测试机器的压力就会相对小一点;
四、添加相关请求,结果树等,运行查看效果
经过结果树能够看到,请求是批量执行的;
1)开始执行的脚本,观察请求的增长数量趋势;
或
2)对比请求的发送时间;
四、其余实践
(1)实践1--synchronizing timer应用于多个sampler中的其中一个
若是但愿定时器仅应用于其中一个sampler,则把该定时器做为子节点加入,以下图
定时器仅仅对其上的HTTP请求1起做用,即仅在HTTP请求1执行前执行定时器,和HTTP请求2无关。
(2)实践2--synchronizing timer应用于多个sampler
以下,执行HTTP请求1和HTTP请求2前都会执行同步定时器一、2。当执行一个sampler以前时,和sampler处于相同做用域的定时器都会被执行;
注意点
一、网上部分人说“集合点的位置必定要在Sample(采样器)以前才能生效。”
此言差矣,在Jmeter中,timer是在sampler以前执行的。无论这个定时器的位置放在sampler以后,仍是以前。固然,若是有多个timer的时候,在相同做用域下,会按上下顺序执行timer,这个就须要慎重放置timer的顺序;
不过,为了更好的可读性,仍是建议将timer放在对应的sampler前面 或 子节点中;
二、Synchronizing timer 仅做用于同一个JVM中的线程。
因此,若是使用并发测试,确保"Number of Simultaneous Users to Group by"中设置的值不大于它所在线程组包含的用户数。
(原文:Synchronizing timer blocks only within one JVM, so if using Distributed testing ensure you never set "Number of Simultaneous Users to Group by" to a value superior to the number of users of its containing Thread group considering 1 injector only)
试想:a.若是分布式测试时,synchronizing timer做用于全部jvm,那么jvm之间或者说监控jvm工做的部件就须要频繁通信,肯定线程的数量及状态等,而后集结了足够的线程后,又要发送信号让Jmeter来发送测试请求,中间存在延时,这样就没法模拟更真实的高并发了,并且这个东西还会消耗测试机器的一部分性能,会给测试结果带来负面影响;
因此暂时是只支持控制单个jvm,若是后面有办法解决上面那些问题后,就能够实现控制多个jvm,控制总并发量;
b.若是分布式测试,并使用了Synchronizing timer,且设置的值是小于单个jvm的线程数量;
可是,较难确保全部jvm都在同一时间点集结了一样数量的线程数,这样就很难下测试结论了,由于都不知道是多少并发下的性能表现;固然了,能够将线程的启用时间拉长,并将超时时间延长,这样就极可能会与同一时刻集结到足够的线程,达到超高并发的测试;
因此,分布式测试与Synchronizing timer通常不是同时使用的;若是非要用,则须要慎重设置相关参数;
三、若是设置Timeout in milliseconds为0,且线程数量没法达到"Number of Simultaneous Users to Group by"中设置的值,那么Test将无限等待,除非手动终止。
这个没法达到的状况有以下几种:
a.设置的值大于线程数量,这样就永远没法达到了;
b.最后一批线程数不够集合点数目;
参考鸣谢:
(1)zjq001X(十一)jmeter-集合点---学习笔记:http://blog.csdn.net/zjq001x/article/details/53107159