JMeter学习笔记(三):线程组

Thread Group基础线程组介绍

JMeter学习笔记(三):线程组_第1张图片

Thread Group的简单理解

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

Thread Group提供的主要作用

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

Thread Group的独立性

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

Thread Group线程属性讲解

JMeter学习笔记(三):线程组_第2张图片

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

默认: 继续
建议: 继续
假设一个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 将以最大的可能去发送请求,以此测试出最大并发数
线程属性值的简单栗子

JMeter学习笔记(三):线程组_第3张图片
上图: 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】

JMeter学习笔记(三):线程组_第4张图片
调度器的作用: 控制每个线程组运行的持续时间以及它在多少秒后再启动

  • Duration (seconds) : 持续时间;线程组运行的持续时间
  • Startup Delay (seconds): 启动延迟;测试计划开始后,线程组的 线程 将在多少秒后 再启动运行
调度器和循环次数的关系
  • 循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
  • 循环次数设置为永远或 -1 时,持续时间才会生效
调度器注意事项

当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的~
所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟

Stepping Thread Group线程组介绍

前言

Stepping Thread Group是第一个自定义线程组,但,随着版本的迭代,已经有更好的线程组代替Stepping Thread Group了【Concurrency Thread Group】,所以说Stepping Thread Group已经是过去式了,但,咱们还是要介绍下的

Stepping Thread Group线程组以及后面介绍的Concurrency Thread Group线程组在JMeter本身是没有的,需要安装插件,只需要在官网下载 plugins-manager.jar 包,放在jmeter安装路径的lib/ext目录下即可使用:https://jmeter-plugins.org/install/Install/,官网下载速度较慢,可使用下方链接下载,下载链接中JMeterPlugins-Extras-1.4.0和JMeterPlugins-Standard-1.4.0插件放在jmeter安装路径的lib/ext目录下即可使用。
链接:https://pan.baidu.com/s/1ekVPXnb-z8OJUP9IerD9aQ
提取码:g716

Stepping Thread Group的特性

  • 有预览图显示估计的负载
  • 可延迟启动线程组
  • 可持续增加线程负载
  • 可设置最大负载的持续运行时间

Stepping Thread Group的作用

  • 减少服务器的瞬时压力,做性能测试应该逐步增加压力,而不是瞬时加压
  • 逐步增压越平缓越好,更容易从结果看到多少压力值下,有性能瓶颈

Stepping Thread Group参数详解

JMeter学习笔记(三):线程组_第5张图片

  • **this group will start:**表示总共要启动的线程数;若设置为 10,表示总共会加载到 10 个线程
  • **first,wait for:**从运行之后多长时间开始启动线程;若设置为 0 秒,表示运行之后立即启动线程
  • **then start:**初次启动多少个线程;若设置为 0 个,表示初次不启动线程
  • **next add:**之后每次启动多少个线程;若设置为 1个,表示每个梯次启动 1 个线程
  • **threads every:**当前运行多长时间后再次启动线程,即每一次线程启动完成之后的持续时间;若设置为 5秒,每梯次启动完线程之后再运行 5 秒
  • **using ramp-up:**启动线程的时间;若设置为 5 秒,表示每次启动线程都持续 5 秒(和基础线程组的ramp-up一样意思)
  • **then hold load for:**线程全部启动完之后持续运行多长时间,如图:设置为 60 秒,表示 100 个线程全部启动完之后再持续运行 60 秒
  • **finally,stop/threads every:**多长时间释放多少个线程;若设置为 5 个和 1 秒,表示持续负载结束之后每 1 秒钟释放 5 个线程
从负载预览图,读懂所有参数

JMeter学习笔记(三):线程组_第6张图片

  • 从第0秒开始启动线程,每 5 秒内启动10个线程并且运行5秒,以此循环,直到一共启动了 10 个线程
  • 当已启动 10 个线程后,持续负载运行60秒
  • 持续负载运行60秒后,每 1 秒释放五个线程,直到全部线程被释放**【注意:线程释放过程中,线程依然在运行】**

结合Active Threads Over Time

JMeter学习笔记(三):线程组_第7张图片

  • 运行Stepping Thread Group需要和Active Threads Over Time结合起来使用,这样能看到动态的阶梯加压效果
  • 如果和Stepping Thread Group负载预览图基本一致,证明加压效果是正常的

Concurrency Thread Group线程组介绍

  • Concurrency Thread Group提供了用于配置多个线程计划的简化方法
  • 该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程
  • 和标准的Thread Group不同,它不会预先创建所有线程,因此不会使用额外的内存
  • 对于上篇讲到的Stepping Thread Group来说,Concurrency Thread Group是个更好的选择,因为它允许线程优雅地完成其工作
  • Concurrency Thread Group提供了更好的用户行为模拟,因为它使您可以更轻松地控制测试的时间,并创建替换线程以防线程在过程中完成

Concurrency Thread Group参数讲解

JMeter学习笔记(三):线程组_第8张图片

  • Target Concurrency:目标并发(线程数)
  • Ramp Up Time:启动时间;若设置 1 min,则目标线程在1 imn内全部启动
  • Ramp-Up Steps Count:阶梯次数;若设置 6 ,则目标线程在 1min 内分六次阶梯加压(启动线程);每次启动的线程数 = 目标线程数 / 阶梯次数 = 60 / 6 = 10
  • Hold Target Rate Time:持续负载运行时间;若设置 2 ,则启动完所有线程后,持续负载运行 2 min,然后再结束
  • Time Unit:时间单位(分钟或者秒)
  • Thread Iterations Limit: 线程迭代次数限制(循环次数);默认为空,理解成永远,如果 运行时间到达 Ramp Up Time + Hold Target Rate Time,则停止运行线程 【不建议设置该值】
  • Log Threads Status into File: 将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件);
特别注意点
  • Target Concurrency只是个期望值,实际不一定可以达到这个并发数,得看上面的配置 【电脑性能、网络、内存、CPU等因素都会影响最终并发线程数】
  • Jmeter会根据Target Concurrency的值和当前处于活动状态的线程数来判断当前并发线程数是否达到了Target Concurrency;若没有,则会不断启动线程,尽力让并发线程数达到Target Concurrency的值

Concurrency Thread Group和Stepping Thread Group的区别

官方说法
  • Stepping Thread Group不提供设置启动延迟时间,阶梯增压过渡时间,阶梯释放过渡时间,但Concurrency Thread Group提供
  • Stepping Thread Group可以阶梯释放线程,而Concurrency Thread Group是瞬时释放(具体看下面介绍)
  • Stepping Thread Group设置了需要启动多少个线程就会严格执行,Concurrency Thread Group会尽力启动线程达到Target Concurrency值
通俗点理解
  • Stepping Thread Group 是手动场景:测试过程,按照设定好的步骤执行
  • Concurrency Thread Group 是目标场景:达到某个目标运行场景,测试过程不可控,动态变化
类比 LR
  • Stepping Thread Group :设置并发用户数,持续时间等,每隔多少时间自动增加多少个用户
  • Concurrency Thread Group:预设一个目标并发数,每隔一段时间增加一部分并发数,直到 TPS 达到目标并发数,然后持续运行一段时间

你可能感兴趣的:(JMeter学习笔记,jmeter)