什么是吞吐量控制器?

英文是Throughput Controller
JMeter 官网上是这么介绍的:吞吐量控制器允许用户控制其子元件的执行频率。

执行模式

吞吐量控制器中支持两种执行模式:

  • Percent executions(执行百分比)
    使控制器按照设置的百分比去执行。
  • Total executions(执行总数)
    使控制器执行设定的总次数。

属性介绍

图中红框的这三个字段最重要:enter image description here

  1. Based on:选择执行模式,见上文。
  2. 吞吐量:这个值的作用根据你选择的执行模式不同,可分为两种情况:
    2.1 Percent executions 模式下,代表执行次数的百分比。如填写30,则表示子元件会执行原执行次数*0.3次。
    2.2 Total executions模式下,代表执行的总次数。如填写50,则表示子元件会执行50次。
  3. Per User:表示是否要在每个线程组上单独应用控制器的设置。比如说,如果在Total executions模式下填写了50的吞吐量,勾选了Per User,那么控制器的子元件会执行线程数 * 50次;不勾选Per User,那么控制器的子元件会执行50次。

怎么使用?

使用吞吐量控制器最关键的两个参数是执行模式(Based on的选项)和Per User,下面用控制变量法来介绍一下这个组件的一些特点。

测试脚本的结构:
enter image description here

Percent executions 模式

这个模式下,吞吐量里的值为执行次数的百分比,也就是说,控制器的子元件的执行次数 = 线程组的并发数 * 吞吐量%

情况一:控制器的吞吐量之和等于100

条件:

  • 并发数:10
  • 控制器1的吞吐量:50
  • 控制器2的吞吐量:30
  • 控制器3的吞吐量:20
  • Per User:不勾选

示例图:
讲一讲JMeter中的吞吐量控制器-小白菜博客
enter image description here

结果:

请求的比例如下:

  • baidu:5次
  • 当当:3次
  • taobao:2次

enter image description here

情况二:控制器的吞吐量之和小于100

条件:

  • 并发数:10
  • 控制器1的吞吐量:50
  • 控制器2的吞吐量:10
  • 控制器3的吞吐量:20
  • Per User:不勾选

结果:

请求的比例如下:

  • baidu:5次
  • 当当:1次
  • taobao:2次

enter image description here

情况三:控制器的吞吐量之和大于100,但每个控制器的吞吐量都没超过100

条件:

  • 并发数:10
  • 控制器1的吞吐量:50
  • 控制器2的吞吐量:70
  • 控制器3的吞吐量:40
  • Per User:不勾选

结果:

请求的比例如下:

  • baidu:5次
  • 当当:7次
  • taobao:4次

enter image description here

情况四:控制器的吞吐量之和大于100,并且某个控制器的吞吐量超过了100

条件:

  • 并发数:10
  • 控制器1的吞吐量:150
  • 控制器2的吞吐量:30
  • 控制器3的吞吐量:40
  • Per User:不勾选

结果:

请求的比例如下:

  • baidu:10次
  • 当当:3次
  • taobao:4次

enter image description here

总结

从以上四个测试中可以看出,吞吐量控制器在Percent executions 模式下有以下几个特点:

  • 吞吐量控制器之间彼此不会影响。
  • 吞吐量的取值范围在0-100,填写超过100的值作为100计算。
  • 以及Per User参数在此模式中不生效,测试结果就不贴了。

Total executions 模式

这个模式下,吞吐量里的值是总执行次数。在这个模式里,可能会用到Per User参数,这个参数的作用是:

  • 若勾选,每个线程会单独计算执行次数;
  • 若不勾选(默认),所有线程统一计算执行次数

测试脚本结构为:
enter image description here

情况一:吞吐量大于并发数*循环次数,不勾选Per User

条件:

  • 并发数:10
  • 循环次数:1
  • 控制器1的吞吐量:15
  • 控制器2的吞吐量:20
  • Per User:不勾选

结果:

请求的比例如下:

  • baidu:10次
  • 当当:10次
    enter image description here

情况二:吞吐量小于并发数*循环次数,不勾选Per User

条件:

  • 并发数:1000
  • 循环次数:1
  • 控制器1的吞吐量:789
  • 控制器2的吞吐量:999
  • Per User:不勾选

结果:

请求的比例如下:

  • baidu:789次
  • 当当:999次
    enter image description here

情况三:并发数吞吐量大于并发数循环次数,勾选Per User

条件:

  • 并发数:10
  • 循环次数:5
  • 控制器1的吞吐量:70
  • 控制器2的吞吐量:100
  • Per User:勾选

结果:

请求的比例如下:

  • baidu:50次
  • 当当:50次

enter image description here

情况四:并发数吞吐量小于并发数循环次数,勾选Per User

条件:

  • 并发数:10
  • 循环次数:10
  • 控制器1的吞吐量:3
  • 控制器2的吞吐量:5
  • Per User:勾选

结果:

请求的比例如下:

  • baidu:30次
  • 当当:50次

enter image description here

总结

从这几个测试中可以得出:

  • 执行次数的最大值为并发数 * 循环次数,在此基础上可以对子元件的执行次数进行调整。
  • 勾选Per User,则执行的总次数数将是用户数(并发数) * 给定的吞吐量数