Loading

性能测试 - JMeter定时器

about

在默认情况下,jmeter发送每个请求的间隔极短,如果线程数足够大,瞬间就会将服务器压死。
在实际的业务过程中,请求之间是有一定时间的停顿的,比如登录网站时输入用户名和密码需要时间(用户会确认下输入的对不对),所以在请求之间设置合理的延时是必须的,也更接近用户的真实业务情况。

在jmeter中,定时器组件提供了系列不同类型的延时控制。合理使用定时器组件,能让你的性能测试更接近真实,更能挖掘出系统的瓶颈和评估系统的性能指标。

基本规则:在每个采样器(sampler)之前去执行,也就是定时器的作用域:

  • 定时器是在每个采样器(sampler)之前执行的,而不是之后(无论定时器位置在采样器(sampler)之前还是下面)。
  • 当执行一个采样器(sampler)之前时,所有当前作用域内的定时器都会被执行。
  • 如果希望定时器仅应用于其中一个采样器(sampler),则把定时器作为子节点加入。

截止到目前,jmeter共提供了如下几种定时器,以适应更多的场景:

我们来看看常用的定时器的用法。

固定定时器

固定定时器,应用场景,登录,比如用户在输入完密码之后,会思考一下用户密码是否输入有误,然后再点击登录,那么这个固定定时器,就可以等2秒再去执行,那也因此有些问题,这个固定的时间相对比较死板。

http://www.neeo.cc:6001/get?user=zhangkai&pwd=666  # get

在线程组内新建一个"HTTP请求"取样器,并为该取样器添加一个"固定定时器":

"固定定时器"的配置:

结果,没啥好看的:

同步定时器

场景应用:0点秒杀

"同步定时器",jmeter集合点是通过这个定时器来实现的,也就是人为并发。

PS:集合点用于同步虚拟用户恰好在某一时刻执行任务,确保用户更准确、集中的进行某个指定操作,达到更理想的负载模拟效果,更有针对性地对某个可能存在性能问题的模糊或子系统施压,以便找到性能瓶颈。

简单来说,集合点的概念,相当于我们10个人约好明天上午9点一起去逛街,那么到明天上午九点,会有如下几种情况:

  • 10个人在9点之前就凑齐了,走吗?不走!要等9点再走!
  • 9点了,10个人才到了8个,那还等剩下的两个人吗?可以选择等,如果永远凑不够10个,就一直等;还有一种情况就是,不等剩下的两个人了,直接到点就走,有几个人走几个人。

"同步定时器"通过不同的参数也能完成不同的场景,所以,它在做性能测试的时候,模拟的更准确。

首先,在线程组内添加一个"HTTP请求"取样器:

再为"HTTP请求"取样器添加一个"同步定时器":

接下来,我们来研究同步定时器各个参数组合情况,都有哪些不同的结果产生。

"同步定时器"的模拟用户组的数量参数,有以下几种情况:

  • 等待所有的虚拟用户(线程)后,一次性发送所有的请求,示例:

    • 线程组的线程数:5;
    • 同步定时器的模拟用户组的数量:10;
    • 同步定时器的超时时间以毫秒为单位:0;
    • 结果是,jmeter会一直等凑够10个用户,但很明显,因为线程数为5,它永远也凑不够10个用户,而且也没设置超时时间,所以,jmeter就一直在等在凑够10个用户.....

  • 如果设置为0,等同于设置为线程组中线程数的值,示例:

    • 线程组的线程数:5;
    • 同步定时器的模拟用户组的数量:0;
    • 同步定时器的超时时间以毫秒为单位:1000;
    • 结果是,如果在规定的超时时间内,凑够了5个用户,然后会一次性的发送5个请求;如果在规定的超时时间内,没有凑够5个用户,比如只凑够了3个,那么当超时时间结束后,会发送3个请求;如果没有设置超时时间,jmeter会在1000毫秒内发送5个请求。

  • 如果设置的值不大于它所在线程组的线程数,jmeter会轮询的在超时时间结束发送指定的用户数,示例:

    • 线程组的线程数:5;
    • 同步定时器的模拟用户组的数量:4;
    • 同步定时器的超时时间以毫秒为单位:2000;
    • 结果是,如果在没达到超时时间时,哪怕jmeter凑够了4个用户,它也不发送请求,而是要等超时时间结束再一次性的发送所有的请求;问题来了,我们线程数时5个,此时发送了4个请求,还剩下1个用户每发送呢?怎么办?jmeter会在下一次超时时间结束在发送剩下的1个请求;如果线程数还没使用完,就继续在下一次轮询发送,你可以将线程数设置5,同步定时器的模拟用户数设置为2,超时为2000毫秒,再运行会发现,每2000毫秒发送2个用户,最后一轮会发送1个用户。

除了上述的几种情况之外,"同步定时器"的作用域也要引起你的注意:

  • 如果它位于线程组内,跟其他请求同级,则所有的请求都会受此影响。
  • 如果它位于指定的请求内,做只作用于该请求,不影响线程组内的其他请求。

欢迎斧正,that's all,see also:

jmeter(七)定时器

posted @ 2020-06-11 15:13  听雨危楼  阅读(238)  评论(0编辑  收藏  举报