Jmeter源码系列(6)-Jmeter线程组启动过程

前言

在上一篇文章中,我们介绍了Jmeter的执行引擎,在那篇文章中我们简单提到了,Jmeter的执行引擎会根据测试计划中的线程组配置,创建线程组,并启动线程组中的线程,本文将详细分析Jmeter线程组启动的过程。

但是在聊Jmeter线程组启动之前,我们需要先了解一下Jmeter使用的并发模型是什么。目前业界比较流行的性能测试工具除了Jmeter之外,还有其他的一些性能测试工具,比如LocustLoadRunnerGatling…等等,这些性能测试工具使用的并发模型不尽相同。

[说到并发,我们首先想到的就是服务端系统的并发模型,现在常见的并发模型有多线程模型,事件循环模型,Actor模型和CSP模型等。为了能测试服务器系统的并发能力,性能测试工具也需要支持与之相应的并发发包能力。而充分了解性能测试工具的并发模型,可以更好地帮助你选择适合自己的性能测试工具。JMeter,Locust和Gatling选择了三种不同的并发模型,这个应该是和开发者当时的技术背景,业务需求,资源情况等密切相关的。所以没有必要去探究当时作者为什么要选择这个模型,但是可以尝试去理解这些不同模型的特点,从而选择到适合自己的模型。JMeter使用的是多线程模型,Locust使用的是事件循环模型,而Gatling使用的是Actor模型,最近又有一个后起之秀K6,它则使用的是CSP模型。并行和并发是完全不同的两个概念,简单说并行是操作系统和CPU的一种能力,而并发是应用程序的一种能力。如果性能测试工具支持多线程或者多进程,并且运行的操作系统支持并行以及CPU是多核的情况下,其发包能力能大大增强]。(此段引用自https://zhuanlan.zhihu.com/p/387117598)

Jmeter线程组分类

在Jmeter中,线程组主要分为三种,分别是 Setup Thread GroupThread GroupPost Thread Group。其中Setup Thread GroupPost Thread Group是可选的,而Thread Group是必须的。Setup Thread Group是在测试计划开始之前执行的,Post Thread Group是在测试计划结束之后执行的,而Thread Group则是测试计划中真正执行测试的线程组。

这三种线程组继承关系如下:

AbstractThreadGroup

AbstractThreadGroup

AbstractThreadGroup是Jmeter中线程组的基类,它实现了线程组的基本功能,包括线程组的启动,停止,暂停,恢复等操作,同时也定义了线程组的基本属性,比如线程组的名称,线程组的注释,线程组的循环次数等。正如其类注释所说:ThreadGroup holds the settings for a JMeter thread group.

ThreadGroup

ThreadGroup是Jmeter中最常用的线程组,它继承自AbstractThreadGroup,此类最重要的一个方法就是start()方法,该方法用于启动线程组中的线程,此方法用于启动线程组,并根据配置创建线程来进行测试。具体创建线程的过程在此处不展开,将在下文中详细分析。

SetupThreadGroup

SetupThreadGroup是Jmeter中用于执行测试计划前的线程组,它继承自ThreadGroup,此类在Jmeter源码中并无具体实现,完全由父类ThreadGroup实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package org.apache.jmeter.threads;


/**
* SetupThreadGroup.java is a special type of ThreadGroup that can be used for
* setting up of a test before the bulk of the test executes later.
*
*/
public class SetupThreadGroup extends ThreadGroup {
private static final long serialVersionUID = 240L;

public SetupThreadGroup() {
super();
}
}

PostThreadGroup

PostThreadGroup是Jmeter中用于执行测试计划后的线程组,它也继承自ThreadGroup,此类在Jmeter源码中也并无具体实现,完全由父类ThreadGroup实现。

1
2
3
4
5
6
7
8
9
10
11
package org.apache.jmeter.threads;


/**
* PostThreadGroup is a special type of ThreadGroup that can be used for
* performing actions at the end of a test for cleanup and such.
*/
public class PostThreadGroup extends ThreadGroup {
private static final long serialVersionUID = 240L;
}

以上三种线程组我们在Jmeter中使用时会发现三者的配置界面完全一致,只是执行顺序有所不同,下面我们详细分析一下这三种线程组在Jmeter中的执行顺序,以及Jmeter线程组的运行原理。

Jmeter线程组启动过程