Concurrency Thread Group分布式模式压测时长不符问题咨询
问题分析与解决方案
一、为什么实际每分钟新增75用户?
核心问题是分布式模式下吞吐量控制的作用范围理解偏差:
- 你设置的
恒定吞吐量50请求/分钟,如果使用Constant Throughput Timer且未开启分布式全局控制,该阈值是单节点独立生效,而非集群总吞吐量。若每台从机都按此阈值执行,总吞吐量会远超预期(比如单节点实际跑15请求/分钟,5台合计就是75)。 - 另外你提到的"应耗时40分钟"计算有误:总请求数1500,按50请求/分钟的速率,理论耗时应为
1500/50=30分钟,而非40分钟。
二、配置调整方案(匹配核心需求)
你的目标是逐步加压到系统崩溃,记录最大并发登录用户数,单迭代,系统无法处理即停止,按以下步骤调整:
1. 修正加压逻辑(实现匀速新增用户)
放弃恒定吞吐量配置,改用Concurrency Thread Group的梯度加压模式更直接:
- 设置
Initial Concurrency为0,Target Concurrency为1500,Ramp Up Time设为1800秒(30分钟),这样会线性增加并发用户,每分钟新增50个(1500/30=50),完全匹配预期节奏。 - 若坚持用恒定吞吐量,需在
Constant Throughput Timer中开启Distributed Mode,并将Calculate Throughput as设为Total across all threads (distributed),这样50请求/分钟是集群总吞吐量,各从机会自动分摊请求量。
2. 实现系统崩溃时自动停止测试
- 添加
Response Assertion:检查登录请求的响应状态码(比如必须为200)、响应时间(比如超过5秒判定为卡顿)。 - 添加
If Controller,条件设为${__jexl3(${JMeterThread.last_sample_ok} == false,)},当断言失败时,执行Test Action Sampler,在其中调用${__jmeter.engine.stop()}停止整个测试。 - 同时在
Concurrency Thread Group中勾选Stop Thread on Error,确保单个请求失败时立即终止对应线程,避免无效请求占用资源。
3. 分布式凭证配置验证
- 确保5台从机的300个登录凭证完全唯一,无重复账号。每台从机用独立的CSV文件(如
slave_1.csv至slave_5.csv)存储凭证,通过CSV Data Set Config加载,避免同一账号多次登录导致的测试数据失真。
三、关键细节提醒
- 迭代次数设为1是正确的,但要注意:若需统计并发登录用户数,必须维持用户会话活跃。添加
HTTP Cookie Manager保存登录会话,或者在登录后定期发送轻量请求(如获取用户基本信息),防止会话超时断开。 - 分布式测试时,主机仅负责调度,不执行测试任务,5台从机各跑300线程,总计1500线程,完全覆盖最大用户数需求。
内容的提问来源于stack exchange,提问作者Chinni
相关产品推荐
相关产品推荐

