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 Groups 和 Throughput 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 内部包含了多少个请求?如果内部请求响应时间比较长,我可以帮你算一下线程组大概需要开多少并发。

相关推荐
小羊没烦恼!4 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里4 天前
java中的继承和多态的区别
java
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕4 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖4 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时4 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang4 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++