Jmeter Transaction Controller(事务控制器) 的 TPS(每秒事务数)严格固定为 1

在 JMeter 中,要将某个 Transaction Controller(事务控制器) 的 TPS(每秒事务数)严格固定为 1,最干净、最常用的方法是结合使用 Constant Throughput Timer(常数吞吐量定时器)Precise Throughput Timer(精准吞吐量定时器)

这里有几种主流的操作方案,你可以根据需求选择:


方案一:使用 Constant Throughput Timer(最简单)

这是 JMeter 自带的经典组件,适合负载比较稳定的场景。

操作步骤:

  1. 结构设置 :右键点击你的 Transaction Controller -> Add (添加) -> Timer (定时器) -> Constant Throughput Timer

    • 注意:务必把它放在 Transaction Controller 内部,这样它只对这个事务控制器生效。
  2. 参数配置

    • Target throughput (in samples per minute) :填写 60.0。(因为它是按分钟计算的,1 \\text{ TPS} \\times 60 \\text{秒} = 60)。

    • Calculate Throughput based on :选择 this thread-only(仅针对当前线程)或 all active threads(所有活跃线程)。通常建议选择 all active threads,这样无论你开多少个线程,总 TPS 都会被压在 1。

⚠️ 避坑提示 :JMeter 的定时器只能延迟 请求,不能加速 请求。如果你的外层线程池(Thread Group)只开了 1 个线程,而这个 Transaction 内部所有请求总耗时超过了 1 秒(比如压测服务器响应太慢),那么即便你设了 60,实际 TPS 也达不到 1。所以线程组的并发线程数一定要配得稍微充裕一点(比如 3~5 个线程)。


方案二:使用 Precise Throughput Timer(更精准)

如果你希望吞吐量极其精准,或者在配合同步定时器时表现更稳定,推荐用这个。

操作步骤:

  1. 右键点击 Transaction Controller -> Add (添加) -> Timer (定时器) -> Precise Throughput Timer

  2. 参数配置

    • Target throughput (in samples per period) :填写 1.0

    • Throughput period (in seconds) :填写 1。(意思就是每 1 秒执行 1 次)。

    • Test duration (in seconds):填写你的总压测时间(比如 3600 秒)。


方案三:配合 Concurrency Thread Group + Throughput Shaping Timer(高阶推荐)

如果你需要长期压测,且希望 TPS 极其平滑地一条直线拉在 1,用 JMeter 官方的 Plugins 插件组合是最好的方案。

  1. 安装 Custom Thread GroupsThroughput Shaping Timer 插件。

  2. 线程组使用 bzm - Concurrency Thread Group

  3. 在线程组下添加 jp@gc - Throughput Shaping Timer

  4. 在 Timer 的表格里添加一行:Start RPS: 1, End RPS: 1, Duration: 你的压测时间

  5. 回到 Concurrency Thread Group,在 Feedback Loop(反馈环)中绑定这个 Timer。这样 JMeter 会根据实际 TPS 是不是 1,自动动态调整线程数。


💡 核心检查点(为什么我的 TPS 固定的不是 1?)

如果你配置完发现 TPS 还是不对,请检查 Transaction Controller 的这个勾选项:

  • Generate parent sample

    • 勾选(推荐) :整个控制器在结果中只算作 1 个 Sample。此时 Timer 控制的就是这个 Transaction 的 TPS。

    • 不勾选:控制器内部的每一个子请求都会单独算作 Sample。此时 Timer 控制的可能会变成内部子请求的 TPS,导致整个 Transaction 的 TPS 暴跌。

你目前压测的这个 Transaction Controller 内部包含了多少个请求?如果内部请求响应时间比较长,我可以帮你算一下线程组大概需要开多少并发。

相关推荐
MacroZheng9 小时前
IDEA + 阿里 Qoder = 王炸!
java·人工智能·后端
2401_858286119 小时前
OS74.【Linux】线程互斥(3) 线程安全、重入
linux·运维·服务器·开发语言·线程
jsl_jsl_jsl9 小时前
Java 后端基石:JVM 运行机制、内存管理与传参陷阱
java
爱喝水的鱼丶9 小时前
SAP-ABAP:数据类型与数据对象 第二篇:底层逻辑篇——数据类型的分类体系与底层存储原理
运维·开发语言·学习·sap·abap
肥胖小羊9 小时前
基于状态机的客户生命周期流转与自动化触达引擎实现
开发语言·python
玄泽幻库9 小时前
【主流版本】JDK安装版下载地址和环境配置方法
java·开发语言·jdk
西凉的悲伤9 小时前
Java parallelStream并行流
java·开发语言·parallelstream·并行流
少司府9 小时前
C++基础入门:深挖list的那些事
开发语言·数据结构·c++·容器·list·类型转换·类和对象
两年半的个人练习生^_^9 小时前
JVM 内存结构详解
java·jvm