Jmeter-Transaction Controller事务控制器介绍

JMeter的Transaction Controller是一种用于聚合多个采样器响应时间的工具。它会生成一个额外的取样器,将包含的所有单元(如HTTP采样器)的时间一并计算。事务控制器有两种工作模式:一种是在所有子样本之后添加额外样本,另一种是作为子样本的父级添加。生成的样本时间包括所有子样本和定时器的时间,但可能因系统时钟精度而略有不同。只有当所有子样本成功时,事务控制器才会认为整个事务成功。在以父级模式下,子样本在Tree View Listener中可见,但在CSV日志文件中不会单独显示,但可以通过XML文件保存。

事务控制器会产生一个额外的取样器(sampler),用来计算衡量它所包含的所有单元(比如包含2个http采样器)。

注意的是,并不只是可以包含采样器,可以包含所有的可以处理的单元。  使用事务器的具体教程,请猛击这里

For JMeter versions after 2.3, there are two modes of operation

additional sample is added after the nested samples

additional sample is added as a parent of the nested samples

The generated sample time includes all the times for the nested samplers, and any timers etc. Depending on the clock resolution, it may be slightly longer than the sum of the individual samplers plus timers. The clock might tick after the controller recorded the start time but before the first sample starts. Similarly at the end.

The generated sample is only regarded as successful if all its sub-samples are successful.

In parent mode, the individual samples can still be seen in the Tree View Listener, but no longer appear as separate entries in other Listeners. Also, the sub-samples do not appear in CSV log files, but they can be saved to XML files.

Control Panel

Parameters

AttributeDescriptionRequired
NameDescriptive name for this controller that is shown in the tree, and used to name the transaction.Yes
Generate Parent SampleIf checked, then the sample is generated as a parent of the other samples, otherwise the sample is generated as an independent sample.Yes
Include timer duration in generated sampleWhether to include timer, pre- and post-processing delays in the generated sample. Default is true to be compatible with the behaviour in previous versions of JMeter.Yes

<think>我们正在讨论JMeter中的控制器层级配置问题。用户特别询问了事务控制器Transaction Controller)和临界部分控制器(Critical Section Controller)的层级关系设置。根据引用内容,我们可以总结: 1. **事务控制器**:用于将多个取样器(Sampler)组合成一个事务,测量整个事务的总时间。它有两个关键选项: - `Generate parent sample`:如果勾选,事务控制器会作为父样本显示在结果树中,事务的成功取决于所有子取样器的成功。 - `Include duration of timer and pre-post processors`:是否将定时器和预处理/后处理器的延迟包含在事务时间中(一般不勾选)。 2. **临界部分控制器**:用于确保其子元素(通常包含多个取样器)在同一时刻只能被一个线程执行,实现线程间的互斥。这类似于多线程编程中的锁机制。 **层级结构设置原则**: - 事务控制器可以包含多个取样器或其他控制器(包括临界部分控制器),用于测量整个事务的时间。 - 临界部分控制器通常放在事务控制器内部,以确保事务中的关键部分(需要互斥执行的部分)被正确保护。 **典型配置示例**: 假设我们有一个事务,包含两个操作:登录(Login)和下单(Place Order),其中下单操作需要互斥执行(比如避免重复下单)。我们可以这样配置: ``` 测试计划 └── 线程组 ├── 事务控制器 (事务:登录并下单) │ ├── HTTP请求: 登录 │ └── 临界部分控制器 (锁名称:orderLock) │ └── HTTP请求: 下单 └── 其他取样器... ``` **配置步骤**: 1. 添加线程组。 2. 在线程组下添加事务控制器- 右键线程组 -> 添加 -> 逻辑控制器 -> 事务控制器- 配置事务控制器- 名称:例如“登录并下单事务”。 - `Generate parent sample`:建议勾选,这样在结果树中可以看到整个事务的结果(成功/失败)和总时间,同时也能看到子取样器。 - `Include duration of timer...`:不勾选(避免额外时间影响事务时间统计)。 3. 在事务控制器下添加第一个取样器(如登录请求)。 4. 在事务控制器下添加临界部分控制器: - 右键事务控制器 -> 添加 -> 逻辑控制器 -> 临界部分控制器。 - 配置临界部分控制器: - 名称:例如“下单互斥锁”。 - `锁名称(Lock Name)`:输入一个字符串(如`orderLock`),相同锁名称的临界部分控制器会互斥执行。 5. 在临界部分控制器下添加需要互斥执行的取样器(如下单请求)。 **注意事项**: - **层级顺序**:临界部分控制器必须放在事务控制器内部,这样整个事务时间才会包含临界部分控制器的执行时间(包括等待锁的时间)。 - **锁的作用域**:临界部分控制器的锁名称是全局的,不同线程组中相同锁名称的临界部分控制器也会互斥。 - **事务成功条件**:如果事务控制器勾选了`Generate parent sample`,那么整个事务的成功取决于所有子取样器的成功(包括临界部分控制器内的取样器)。如果其中任何一个取样器失败,整个事务会被标记为失败。 **验证方法**: - 在“查看结果树”中,如果勾选了`Generate parent sample`,你会看到: - 一个父样本(事务控制器),显示整个事务的时间。 - 子样本(登录请求和下单请求)分别显示。 - 通过增加线程数(并发用户),观察临界部分控制器的效果:下单请求不会同时执行(因为互斥锁),而登录请求可以并发执行。 **错误规避**: - 避免将临界部分控制器放在事务控制器之外,否则事务时间不会包含等待锁的时间。 - 锁名称不要重复使用在无关的临界部分控制器上,以免造成不必要的阻塞。 **性能影响**: - 临界部分控制器会引入等待时间(线程等待锁),导致事务时间增加(尤其是在高并发时)。 - 事务控制器本身几乎不会增加性能开销(仅用于统计时间)。 --- ### 相关问题 1. 如何验证临界部分控制器的互斥效果? 2. 事务控制器中是否可以使用多个临界部分控制器? 3. 如何分析事务控制器的聚合报告? 4. 临界部分控制器能否嵌套使用? [^1]: JMeter事务控制器实践。 [^2]: 【Jmeter教程】_事务控制器。 [^3]: jmeter事务控制器。 [^4]: Jmeter必知利器-临界部分控制器。</think>### JMeter事务控制器与临界部分控制器的层级配置方案 #### 一、核心层级原则 1. **嵌套关系(推荐)** 事务控制器作为外层容器,临界部分控制器作为内层互斥单元: ```mermaid graph TD A[事务控制器] --> B[HTTP请求1] A --> C[临界部分控制器] C --> D[HTTP请求2] C --> E[HTTP请求3] ``` - **事务控制器**:测量从HTTP请求1到HTTP请求3的总耗时[^1][^3] - **临界部分控制器**:确保HTTP请求2和3在同一时刻只能被一个线程执行[^4] - **关键配置**: - 事务控制器勾选`Generate parent sample`[^2] - 临界部分控制器设置唯一`锁名称(Lock Name)` 2. **同级协作架构** ```mermaid graph LR A[临界部分控制器] --> B[事务控制器] B --> C[关键业务操作] ``` - 适用场景:需要先获取锁再执行完整事务 - 风险:锁等待时间会被计入事务时间 #### 二、最佳实践配置步骤 1. **基础结构搭建** ```mermaid graph TB 线程组 --> 事务控制器 事务控制器 --> 登录请求 事务控制器 --> 临界部分控制器 临界部分控制器 --> 支付请求 临界部分控制器 --> 库存更新 ``` - 配置示例: ```java // 事务控制器配置 transaction_controller.setGenerateParentSample(true); // 生成父样本[^2] transaction_controller.setIncludeTimers(false); // 排除计时器耗时[^3] // 临界部分控制器配置 critical_section.setLockName("order_lock"); // 全局唯一锁名[^4] ``` 2. **关键参数说明** | 控制器 | 参数名称 | 推荐值 | 作用说明 | |----------------|------------------------------------------|----------|----------------------------| | 事务控制器 | Generate Parent Sample | ✓ 勾选 | 显示父子层级结果[^2] | | | Include duration of timer... | ✗ 不勾选 | 避免计时器影响事务时间[^3] | | 临界部分控制器 | Lock Name | 自定义 | 实现跨线程互斥访问[^4] | | | Timeout (milliseconds) | 5000 | 锁等待超时时间 | 3. **执行流程时序** ```mermaid sequenceDiagram 线程A->>+临界部分控制器: 请求order_lock锁 临界部分控制器-->>线程A: 授予锁 线程A->>支付请求: 执行支付 线程A->>库存更新: 扣减库存 线程A->>-临界部分控制器: 释放锁 事务控制器->>结果树: 记录总耗时(含锁等待) ``` #### 三、性能优化建议 1. **锁范围最小化** 仅将需要互斥的操作放入临界部分控制器: ```mermaid graph LR 事务控制器 --> 非关键操作 事务控制器 --> 临界部分控制器 临界部分控制器 --> 写数据库操作 ``` 2. **超时机制配置** 在临界部分控制器设置超时时间: ```java // 防止线程死锁 critical_section.setTimeout(3000); // 单位毫秒 ``` 超时公式: $$T_{timeout} \leq T_{max\_response} - T_{avg\_process}$$ 3. **结果验证方法** - 查看结果树: - 父样本:显示整个事务时间 - 子样本:显示临界区内操作详情[^2] - 聚合报告: - 检查`Average`列是否包含锁等待时间 - 验证`Error %`是否因锁超时而升高 #### 四、典型错误场景规避 1. **锁嵌套死锁** ```mermaid graph TD 临界部分控制器A --> 临界部分控制器B 临界部分控制器B --> 临界部分控制器A ``` **解决方案**:避免多级锁嵌套,使用扁平结构 2. **事务范围过大** **现象**:将非关键操作放入临界区导致性能瓶颈 **优化**: ```mermaid graph LR 事务控制器 --> 资源加载 事务控制器 --> 临界部分控制器 临界部分控制器 --> 核心交易 ``` 3. **锁名称冲突** **现象**:不同业务使用相同锁名导致虚假阻塞 **规范**: ```java // 按业务命名锁 critical_section.setLockName("payment_"+orderId); ``` --- ### 相关问题 1. 如何验证临界部分控制器的互斥效果? 2. 事务控制器中是否应该包含思考时间(Timer)? 3. 高并发场景下如何优化临界部分控制器的性能? 4. 如何分析事务控制器的聚合报告数据? [^1]: JMeter事务控制器实践 [^2]: 【Jmeter教程】_事务控制器 [^3]: jmeter事务控制器 [^4]: Jmeter必知利器-临界部分控制器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值