

在 JMeter 中,要将某个 Transaction Controller(事务控制器) 的 TPS(每秒事务数)严格固定为 1,最干净、最常用的方法是结合使用 Constant Throughput Timer(常数吞吐量定时器) 或 Precise Throughput Timer(精准吞吐量定时器)。
这里有几种主流的操作方案,你可以根据需求选择:
方案一:使用 Constant Throughput Timer(最简单)
这是 JMeter 自带的经典组件,适合负载比较稳定的场景。
操作步骤:
-
结构设置 :右键点击你的
Transaction Controller-> Add (添加) -> Timer (定时器) -> Constant Throughput Timer。- 注意:务必把它放在 Transaction Controller 内部,这样它只对这个事务控制器生效。
-
参数配置:
-
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(更精准)
如果你希望吞吐量极其精准,或者在配合同步定时器时表现更稳定,推荐用这个。
操作步骤:
-
右键点击
Transaction Controller-> Add (添加) -> Timer (定时器) -> Precise Throughput Timer。 -
参数配置:
-
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 插件组合是最好的方案。
-
安装 Custom Thread Groups 和 Throughput Shaping Timer 插件。
-
线程组使用 bzm - Concurrency Thread Group。
-
在线程组下添加 jp@gc - Throughput Shaping Timer。
-
在 Timer 的表格里添加一行:
Start RPS: 1,End RPS: 1,Duration: 你的压测时间。 -
回到 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 内部包含了多少个请求?如果内部请求响应时间比较长,我可以帮你算一下线程组大概需要开多少并发。