Jmeter系列(7)- 基础线程组Thread Group

简介: Jmeter系列(7)- 基础线程组Thread Group

如果你想从头学习Jmeter,可以看看这个系列的文章哦

htTPS://www.cnblogs.com/poloyy/category/1746599.html

 

Thread Group基础线程组介绍


image.png


Thread Group的简单理解

  • 线程组是一个测试计划的开始点
  • 在一个测试计划中的所有元件都必须在某个线程组下
  • 线程组决定 Jmeter 执行测试计划的线程数

 

Thread Group提供的主要作用

  • 设置线程数
  • 设置ramp-up period
  • 设置执行测试的次数

 

Thread Group的独立性

每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿对服务器的并发访问。

 

Thread Group线程属性讲解


image.png

在取样器错误后要执行的动作

默认:继续

建议:继续

假设一个HTTP Sampler报错了,后面还有其他请求,最好肯定是继续执行下去啦

 

线程属性值

设置的线程属性值是【预期压力值】

而聚合报告是【压力测试的实际结果】

 

线程数

  • Jmeter java进程下启动的线程,用来模拟真实用户数,1线程数 = 1用户数
  • windows下,2g的 java内存,1m 的栈空间,最大启动线程数=1000
  • Linux下,2g的 java内存,1m 的栈空间,最大启动线程数=2000
  • 在Jmeter中,先启动线程,再运行线程,后释放线程【启动线程并运行,释放线程】
  • 线程数建议不超过1000

 

Ramp-Up时间(秒)

  • 预期线程组的所有线程从启动-运行-释放的总时间
  • ramp up=0时,表示瞬时加压,启动线程的时间无限趋近于0
  • 特别注意:在负载测试的时候,尽量把ramp up设置大一些,让性能曲线平缓,容易找到瓶颈点

 

循环次数

  • 每个线程循环执行的次数,默认一次【便于理解:线程的迭代次数、重复发起请求的次数】
  • 如果设置为永远,那么 jmeter 将以最大的可能去发送请求,以此测试出最大并发数

 

线程属性值的简单栗子

image.png

上图:10s 内启动并运行 10 个线程,一共启动 10 个线程,总共发送 20 个请求(10*2),每秒启动一个线程,然后运行两次

备注:如果 ramp-up 时间内,所有线程不能启动运行完的话,时间则会顺延下去

 

Ramp-up 设置注意事项


Ramp-up需要设置足够长的时间来避免在测试刚开始时工作量过大

  • 假如需要大量线程的话,不建议设置成0,0 属于瞬时加压【过小的 ramp-up period 】
  • 如果设置 0,Jmeter 将在测试开始时就启动全部线程并立即发送请求,这样很容易让服务器达到饱满状态,且瞬间会增加很大的负载量,容易让服务器超载,这样是不合理的;
  • 不合理的原因并不是因为平均压力值过高,而是因为所有线程都在初始状态时一起并发访问,从而引起不正常的初始访问峰值,可以通过 Jmeter 的聚合报告看到这种情况

 

Ramp-up还必须足够短,保证最后一个线程在第一个线程完成之前开始运行

  • 如果 Ramp-up 过大,则会降低访问峰值的负载,即没有达到预期的压力峰值,无法获取准确的服务器最大负载情况【过大的 ramp-up period 】
  • 具体的表现为:一些线程还没有启动,初期启动的部分线程已经结束了【导致实际并发量并会小于预期并发量】

 

如何确定一个合理的ramp-up period

  • 首先,让初始点击率接近平均点击率,前提是确定合理的访问量
  • 初始的 ramp-up period = 平均点击率= 总线程/点击率;假如线程数=100,点击率=10次/s,则ramp-up period = 100/10 = 10s

 

延迟创建线程直到需要


延迟创建线程,直到线程被需要、采样器开始执行时才会被创建,避免资源浪费

 

官方英文

When selected, JMeter will allocate threads according to the ramp up times. Otherwise all threads are allocated to the JVM process the moment the test is started, regardless of ramp up time.

 

译文

选中后,JMeter将根据 Ramp-up 时间来分配线程。 否则,无论 Ramp-up 时间如何设定,所有线程都将在测试开始时分配给JVM进程。

 

调度器Specify Thread Lifetime【scheduler


image.png

调度器的作用:控制每个线程组运行的持续时间以及它在多少秒后再启动

Duration (seconds) :持续时间;线程组运行的持续时间

Startup Delay (seconds):启动延迟;测试计划开始后,线程组的线程将在多少秒后再启动运行

 

调度器和循环次数的关系


  • 循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
  • 循环次数设置为永远或 -1 时,持续时间才会生效

 

调度器注意事项


当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的~

所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟

image.png


预习TPS


  • 总的完成请求数 = 线程总数 * 循环次数
  • 平均TPS = 总请求数 / 线程运行总时间【上图,右黄色三角形的时间】
  • 平均TPS(即聚合报告的TPS)是仅供参考的
  • 实际的TPS是由服务器决定的,因为它是衡量服务器处理能力的性能指标



相关文章
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
54 0
|
3月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
57 7
|
15天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
15天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
27 2
|
15天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
15天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
2月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
4月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
3月前
|
SQL 机器学习/深度学习 算法
【python】python指南(一):线程Thread
【python】python指南(一):线程Thread
45 0