jmeter 自带的线程组控件(Thread Group)中有三个重要的属性,分别是 Number of Threads, Ramp-Up Period, 和 Loop Count,用于控制线程组的行为。

这三个属性的重要性与其文档的丰富程度严重不符。不仅变量名简略抽象,而且官方文档也含糊不清。

本文尝试在实验验证的基础上,把这三个变量的含义解释清楚。

目录

  • 用户请求模型
  • 验证方法
  • 单个用户的 Loop Count
  • Ramp-Up Period
  • 用户数 Number of Threads(users)
  • 案例1
  • 案例2
  • 案例3
  • 案例4
  • 案例5
  • 案例6
  • 案例7
  • 案例8
  • 案例9
  • 案例10
  • 结论

TL;DR

太长不看版:

Jmeter 将在 Ramp-Up Period 时间范围内,启动 Number of Threads 个用户(线程),并且使每个用户(线程)重复发出 Loop Count 次请求(采样)。

用户请求模型

我们先来看简单的用户请求的模型。Jmeter 的每一个模拟用户,发起的时机和触发条件由 Jmeter 自己的调度策略指定。Thread Group 三个属性 No. of Threads, Ramp-Up Period, 和 Loop Count 默认都为1 。

三个 1 表示仅有一个用户,在整个测试过程中仅发起一次请求,且请求会在1秒钟内发出。如果把请求在时间轴上展开,将是像下图一样。

图中的蓝色方框表示测试脚本执行时间,Jmeter保证了请求在规定时间内发起。

在开始解释线程组属性之前,我们先看看如何验证对概念的理解是否正确。

验证方法

我们在 Jmeter 里用如下简单的测试方案能观察并且验证我们对概念的理解是否正确。

Test Plan└─Thread Group├─ jp@gc - Dummy Sampler└─ jp@gc - Active Threads Over Time

将 Dummy Sampler 的响应时间默认值改为下图:

这样我们就能通过 Active Threads Over Time 插件观察 Jmeter 发起用户请求的调度逻辑。

比如上面的三个属性值都为1的情况,得到的记录是这样的:

图上右下角的红点的时间坐标是1秒,纵坐标是1,在整幅图里只出现了1次。这就是体现了三个属性值都为1的情况。

单个用户的 Loop Count

在分别讲解三个属性之前,希望您能忘掉先前对这三个属性的理解,因为错误的理解会妨碍您接收新的、正确的概念。

Loop Count 这个属性名称过于简略,无法直观的理解,容易引起误会。Loop Count 真正属性的含义是:

同一个用户,请求的重复次数

当取 Loop Count = 5 时,属性值列表如下:

Jmeter 发起请求的过程在时间轴上延伸是下图的样子:

通过上述的 验证方法 ,可以观察得到

再次发起请求的时机,大概是一次完整的请求结束后。即,响应结束后,发起下一次请求。

Ramp-Up Period

Ramp-Up Period,我认为这个名称可以翻译为“建立时间”。Ramp Up 的含义是指“从无到有”的时间,好比飞机从起飞到平飞的的过程。这里的含义指:

确保在此时间内,建立起全部线程

回头看上面 单个用户的 Loop Count 一节中,由于整个测试中只有一个线程,所以 Ramp-Up Period 这个属性其实是没有发挥作用的,因为任何测试初期至少要建立一个线程。只要建立了一个线程,Ramp-Up Period 就完成任务了。

所以,对于单用户的情况,无论 Ramp-Up Period 设置或长或短,都不会在 Active Threads Over Time 的图中体现出来。

比如,当单用户的 Loop Count = 10 时,属性列表如下时:

得到的 Active Threads Over Time 图形如下:

上图中,尽管 Ramp-Up Period 设置为1秒,但是由于在测试一开始就建立了全部的 1个线程,所以这个线程是可以持续工作到10秒钟的。和 Ramp-Up Period 设置为1秒没有关联。

但是,当多用户并存时,Ramp-Up Period 和 Loop Count 配合在一起,就能得到不同的线程调度结果,参见后面的 案例 。

用户数 Number of Threads(users)

Jmeter 使用线程模拟用户,增加一个线程就是多一个模拟用户。Number of Threads 表示模拟的并发用户数。
当取 Number of Threads = 5 时,由于上面 验证方法 一节中,Dummy Sampler 模拟的响应时间是 500ms 。为了便于观察结果,我们将 Ramp-Up Period 设置为 5秒 ,这样能将5个线程发起请求的时间在时间轴上完全分开而不重叠。属性列表如下:

通过上述的 验证方法 ,可以观察得到

上图可以看出,Jmeter 在5秒钟内发起了5个线程,每个线程各发出1个请求。在时间轴上延伸是下图的样子,一条线表示一个用户:

下面我们尝试从几个案例来观察 Jmeter 在上述三个参数的不同组合下,如何发起请求。

案例1

属性值列表如下图:

上面讲过 ,单个用户时,Ramp-Up Period 不起作用。每个重复的请求将于前次请求结束后发起。因为每次响应时间是500ms,所以,上面属性组合的 Loop 将于30秒结束。得到的图是这样:

案例2

属性值列表如下图:

按上面讲的 ,Jmeter 将在60秒内启动60个线程,所以,Jmeter 的调度方法将是:

每一秒钟启动一个线程,并且在每个线程内发起一个请求。

整个过程将持续60秒,当每一个新的线程发起时,前次线程的响应已经结束,线程被销毁,所以每时每刻都只有一个线程存在。得到的图是这样:

案例3

属性值列表和 案例2 相同,改变的是 Dummy Sampler 的请求的响应时间,从 500ms 改为 1500ms

和 案例2 相同, Jmeter 的调度方法仍然是:

每一秒钟启动一个线程,并且在每个线程内发起一个请求。

但是,当每一个新的线程发起时,前次线程的响应尚未结束,所以每次观测时,总有两个线程同时存在,得到的图是这样:

(注意上图中的纵轴,几乎所有点都在 2 的位置)

案例4

先将 Dummy Sampler 的请求的响应时间,从 1500ms 改回 500ms,再看线程组的属性值列表如下图:

按上面讲的 ,Jmeter 将在10秒内启动60个线程,所以,Jmeter 的调度方法将是:

每一秒钟内启动6个线程,并且在每个线程内发起一个请求。

由于每个请求的响应时间设置为 500ms,每一秒内启动的6个线程将有一半完成后被销毁,同时,整个过程将持续10秒,得到的图是这样:

案例5

线程组属性值列表如下图:

按上面讲的 ,Jmeter 将在60秒内启动10个线程,同时每个线程内重复6次请求,所以,Jmeter 的调度方法将是:

每6秒钟内启动1个线程,并且在每个线程内重复发起6次请求。

由于每个请求的响应时间设置为 500ms,所以每个线程内重复的6次请求将于3秒钟完成,每10秒钟之内,前3秒钟的观测结果,都有1个线程存活。得到的图是这样:

案例6

属性值列表和 案例5 相同,改变的是 Dummy Sampler 的请求的响应时间,从 500ms 改为 1500ms

Jmeter 的调度方法仍然是:

每6秒钟内启动1个线程,并且在每个线程内重复发起6次请求。

由于每个请求的响应时间设置为 1500ms,所以每个线程内重复的6次请求将于9秒钟完成,所以当 Jmeter 启动下一个线程时,仍然有前面线程中的最后2次请求没有收到响应,观测结果是这样:

案例7

属性值列表和 案例5 相同,改变的是 Dummy Sampler 的请求的响应时间,从 500ms 改为 1500ms ,线程组属性值列表如下图:

Jmeter 的调度方法改为:

每6秒钟内启动1个线程,并且在每个线程内重复发起60次请求。

由于每个请求的响应时间设置为 1500ms,所以每个线程内重复的60次请求将于90秒钟完成,所有未完成的线程将累积在一起。从第54秒钟最后一个线程建立起,到90秒的请求结束,整个过程应该是144秒,即2分24秒。观测结果证明了这一点:

案例8

Dummy Sampler 的请求的响应时间 500ms ,线程组属性值列表如下图:

Jmeter 的调度方法改为:

  • 每1秒钟内启动6个线程,并且在每个线程内重复发起6次请求。*

每次启动的线程将和之前的线程叠加,观测结果证明了这一点:

案例9

Dummy Sampler 的请求的响应时间 500ms ,线程组属性值列表如下图:

Jmeter 的调度方法改为:

  • 每6秒钟内启动1个线程,并且在每个线程内无休止的发起请求。*

因为请求永不结束,所以线程永不销毁,每次启动的线程将和之前的线程叠加,观测结果证明了这一点:

案例10

Dummy Sampler 的请求的响应时间改为 1500ms ,线程组属性值列表如下图:

和 案例9 相比,在更短时间内,创建更多的线程,线程的叠加更为明显,而且斜率增大。

Jmeter 的调度方法改为:

每1秒钟内启动6个线程,并且在每个线程内无休止的发起请求。

观测结果证明了这一点:

上图中,从第10秒钟开始,即保持 60 个线程不变。

结论

Jmeter 将在 Ramp-Up Period 时间内,启动 Number of Threads 个线程

并且利用每个线程重复发出 Loop Count 次请求(或者说,Loop Count 次采样)

线程收到响应后,即发出 Loop 内的下一次请求

线程的请求 Loop 次数达到后,线程即销毁。

转载:https://www.lfhacks.com/tech/jmeter-thread-properties#case1

性能测试——jmeter性能测试——重点—核心——线程组、Ramp-Up Period、Loop Count 次采样...相关推荐

  1. jmeter多用户登录跨线程组操作传值

    项目需求: 需要登录两个用户A.B,用户A操作完后会通知B,然后B再操作,B操作完结束或者再通知A. 实现思路: 1. 设置两个线程组Ⅰ.Ⅱ,组Ⅰ添加cookie管理器,里面添加用户A的操作:组Ⅱ添加 ...

  2. Jmeter操作之跨线程组传递参数

    思路:将某一线程组内的变量通过"__setProperty"函数设置成jmeter的全局变量,在另一线程组中通过"__P"函数调用即可. 1.添加-后置处理器- ...

  3. JMeter下变量在线程组间的使用

    方法1:线程组间通信(Inter-Thread communication) 线程组A的PostProcessor组件是将(正则表达式)匹配的数据放入FIFO quene中,由线程组B的PreProc ...

  4. 性能测试(01)-jmeter元件-线程组、调试取样器

    1.线程组 线程组是一个测试计划的开始点.在一个测试计划中的所有元件都必须在某个线程组下.线程组控制 JMeter 执行你的测试计划中的线程数量.每个线程组都会独立的运行测试计划,互不干扰. 1.1. ...

  5. JMeter中如何实现跨线程组关联

    在做压力测试的时候常常会遇见一个场景,想要测试的接口需要登录接口返回的token做参数,或者需要其它接口的认证信息,通常能想到的就是正则表达式提取器,把需要的参数提取出来,传递到另一个HTTP请求中. ...

  6. jmeter性能测试--对MQTT服务做压力测试

    ·环境配置 ·压测步骤 1.MQTT是一个基于客户端-服务器的消息发布/订阅传输协议.要对MQTT协议进行测试,需要下载一个mqtt-xmeter-jar-with-dependencies.jar插 ...

  7. jmeter性能测试并监控服务器

    下载安装plugins-manager.jar​​​​​​​ 下载地址:Install :: JMeter-Plugins.org 下载jar包后,保存在D:\apache-jmeter-5.5\li ...

  8. jmeter线程说明_Jmeter-常用线程组设置及场景运行时间计算

    Jmeter中通过线程组来模拟大用户并发场景,今天主要介绍三个常用的线程组,帮助我们设计更加完善的测试场景,另外介绍下场景执行时间如何计算. 一.Thread Group 取样器错误后要执行的动作 继 ...

  9. JMeter性能测试实战之QPS检测过程解析

    目录结构 一.测试需求 二.测试步骤1.添加线程组2.添加HTTP请求3.设置QPS限制4.添加监视器5.运行脚本6.聚合报告分析 一.测试需求 需求:测试20个用户访问Baidu首页(https:/ ...

  10. jmetter持续时间_Jmeter常用线程组设置及场景运行时间计算

    一.Thread Group 取样器错误后要执行的动作 继续:遇错误继续执行,不影响场景运行.默认为继续,常用. Start Next Thread Loop:执行下次循环,当前循环剩余sampler ...

最新文章

  1. java 中的finally 语句块执行顺序
  2. Redis学习(一)——
  3. 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程)
  4. 多用户远程连接mysql_Mysql权限控制 - 允许用户远程连接
  5. CSDN创作的markdown语法效果示意图
  6. 想学python买什么书好-学python3什么书好
  7. python 在线培训费用-python培训费需要多少钱?
  8. 360 支持linux版本下载地址,360安全浏览器国产稳定版本发布,提供deb软件包下载,附介绍...
  9. 一入职!就遇到上亿(MySQL)大表的优化....
  10. 10_10_安卓加linux命令,Linux 新手必知必会的 10 条 Linux 基本命令
  11. Token九重天——如何设计区块链项目的通证模型
  12. 云筑网认证_云筑网供应商常见问题.doc
  13. 扩展YouTube视频频道,提高业务增量
  14. 微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自http://www.cnblogs.com/yank/p/3409308.html...
  15. labview文件写入与读取
  16. JSD-2204-Redis缓存-Day17
  17. 超微服务器如何查看服务器信息,超微服务器
  18. 分享五款小巧好用的绿色软件
  19. 彩灯控制单片c语言程序,用C语言实现键控彩灯系统
  20. 创新谈-数据库概念设计之几点见解-吴雨光

热门文章

  1. 将进酒服务器是哪个位置的,李白的《将进酒》是他什么时候写下的?又是在哪里写的呢?...
  2. java中的undefined_undefined是什么意思啊?
  3. 毛咕咕 百度有啊现在每天的成交量:
  4. 上海拍牌服务器协议,上海拍牌服务器地址
  5. dnf超时空漩涡副本路线流程图_dnf怎么打超时空漩涡 dnf超时空漩涡打法攻略
  6. hdu4966 GGS-DDU
  7. go reflection
  8. bash: scp: command not found
  9. 龙兵智能名片多企业小程序V2.3.3-开源版
  10. 海外观看2022卡塔尔世界杯中文直播攻略大全