JMeter压测上对于并发的认识误区

本文澄清了JMeter压测中的常见误解,并介绍了如何通过添加ConstantThroughputTimer来精确控制每秒查询率(QPS),实现预期的并发量。
1、误区
在JMeter压测过程中,我们通常认为1s内100的并发量(即:QPS为100)的设置如下:

此时,没有再添加额外的控制器。上述中的参数设置解释:
Number of Threads(users): 启用的并发线程个数
Ramp0up Period(in seconds):在多少秒之内将上述并发的线程启动起来
Loop Count:控制循环次数
说明:
一个常见的误解,认为Number of Threads(users)设置为100,Ramp-Up Period(in seconds)设置为1,就是每秒发起100个请求量(错误)。
上述的设置,表示在1s内启动100个线程,之后,jmeter便以最大限度的100个并发进行压测,不能保证1s内只有100个请求。

我们用上述的设置,对某个接口进行压测,发现:


在一秒内,发起的请求居然有五百多个,与实际想要的1s发起100个并发是有差别的。

2、解决方法:
添加Constant Throughput Timer(常数吞吐量定时器),该定时器可以方便地控制给定的取样器发送请求的吞吐量。

Delay before each affected sampleer下的Target throughput(in samples per minute)设置的值为6000(由于单位是一分钟,如果要求QPS为100,则该值设置为60*100=6000)
Calculate Throughput based on的选项有5个(这里我选择all active threads),分别是:
1)This thread only:控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的target Throughput 乘以改线程的数量。
2)all active threads:设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上次运行结束后等待合理的时间再次运行。活跃线程指同一时刻同时运行的线程。
3)all active threads in current thread group:设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程时,改选项和all active threads选项的效果完全相同。
4)all active threads(shared):与all active threads的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上运行一次结束后等待合理的时间后再次运行。
5)all active threads in current thread group(shared):与all active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间再次运行。
<think> 嗯,用户这次想了解JMeter数据和参数的实现方法。从对话历史看,用户应该已经掌握了基础操作,现在需要深入性能试的核心环节。用户可能是试工程师或开发人员,正在搭建体系,需要具体实施方案。 用户提到的数据主要指参数化输入,参数则是并发控制策略。引用材料提供了关键线索:引用5澄清了并发线程数的误解,引用3区分了并发模式,引用4给出了命令行参数。这些都需要融入回答。 从技术实现看,需要分层讲解: 1. 数据部分要强调CSV读取和函数参数化,这是实际项目中最常用的两种方式 2. 参数化引擎需要解释作用域,比如线程私有数据的必要性 3. 参数要区分GUI和命令行模式,特别是引用4提到的静默参数 4. 必须纠正引用5指出的并发数误区 用户可能还隐藏着分布式的需求,虽然没明说,但引用2提到服务器命令行操作,应该在扩展场景里补充。另外结果分析部分,引用4的输出目录参数很重要,要演示具体用法。 注意到用户多次引用命令行操作,说明可能有自动化需求,回复中要强调可脚本化的方案。对于参数化部分,csv文件路径最好用绝对路径示例,避免权限问题。 最后生成的问题要覆盖用户可能的进阶需求:参数化策略优化、分布式实施细节、结果分析技巧,这些都是实际中的痛点。 </think> 以下基于JMeter数据和参数实现方法的详细说明,结合引用内容的技术要点: --- ### **一、数据实现方法** 1. **参数化输入(动态数据)** - **CSV Data Set Config元件** - 创建`.csv`文件存储试数据(如用户名、订单ID) - 添加配置元件:`CSV Data Set Config` - Filename: 文件路径(如`/data/testdata.csv`) - Variable Names: 定义变量名(如`userID,orderNum`) - 使用变量:在HTTP请求中用`${userID}`引用 - **函数助手动态生成** - 使用`__Random()`生成随机数:`${__Random(1,100,var)}` - 使用`__time()`获取时间戳:`${__time(,timestamp)}` 2. **参数化引擎设置** ```java // 示例:JMeter参数作用域(线程私有) vars.put("sessionID", "dynamicSession_${__threadNum}"); ``` > 每个线程独享变量副本,避免数据竞争[^5] --- ### **二、参数实现方法** 1. **并发控制核心参数** | 参数 | 说明 | 误区澄清[^5] | |--------------------------|----------------------------------------------------------------------|-----------------------------------| | `Number of Threads` | 并发线程总数(实际并发用户数) | ≠每秒请求数 | | `Ramp-Up Period` | 启动所有线程的时长(秒) | 设置1秒启动100线程 ≠ 每秒100请求 | | `Loop Count` | 单线程循环次数 | 设为`Forever`配合调度器实现持续[^3] | 2. **持续配置** ```markdown 1. 勾选线程组:`Loop Count -> Forever` 2. 添加调度器:设置持续时间(如`Duration: 600`秒) ``` > 适用于稳定性试场景(如24小时力维持)[^3] 3. **分布式参数(命令行)** ```bash jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 -l result.jtl ``` - `-R`:指定远端负载机IP列表 - `-l`:结果输出文件[^1][^4] --- ### **三、关键实践要点** 1. **参数化数据与线程关系** - CSV配置中`Sharing Mode`选项: - `All threads`:全局共享数据 - `Current thread`:线程独占数据(推荐性能试) 2. **结果输出参数(静默模式)** ```bash jmeter -n -t test.jmx -l /results/loadtest.jtl -e -o /reports/html/ ``` - `-e`:试后生成HTML报告 - `-o`:指定空文件夹存放报告[^4] 3. **避免并发误区** > 100线程+1秒Ramp-Up → 实际并发量为**100线程持续并发请求**,非每秒100请求[^5] --- ### **四、典型应用场景** | 场景 | 数据实现 | 参数设置 | |---------------------|------------------------------|-------------------------------| | 登录接口 | CSV存储10万用户账号 | 100线程 + Ramp-Up=10秒 | | 订单查询持续性试 | 随机函数生成订单ID范围 | 50线程 + 循环Forever + 持续1小时 | | 分布式高并发 | 分片存储数据到多负载机 | 命令行启动 + 跨服务器协同[^2] | ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值