性能测试工具 jmeter 使用临界部分控制器后吞吐量变低的问题

busgade · 2022年05月19日 · 最后由 萧帅 回复于 2022年05月26日 · 8779 次阅读

因为测试的接口需要涉及顺序,我添加了临界部分控制器,但是加了后,发现 tps 变的很低,
之前两个接口单独测试,能有 300 多 tps,但是配上后只有这么点

有大佬了解的吗,求解答一下,谢谢了
线程数都是设置的相同测试的,没有配部分控制器是 300 多,配了只有 20 多

共收到 5 条回复 时间 点赞

以前没用过,临时查了下,根据个人理解写了下,如果有说的不对的请指正:

查了下 官方文档,临界控制器(Critical Section Controller)本质上是通过加全局锁的方式,让控制器内的子元素(别的控制器/采样器)同一时间只会有一个线程在执行。

从这个原理看,其实就是通过加全局锁控制并发。我理解设计目的应该是用于控制一些在整个场景中存在操作独占资源的时候,通过加锁确保这个独占资源同一个时间只有一个线程在使用(比如写同一个文件,控制无论多少个线程,同一个时间只有一个线程在写这个文件),避免出问题。而且既然用上了锁控制并发,意味着被同一个锁锁上的资源,是无法并发的(拿不到锁的线程都无法执行,只能干等着),最终 tps 会下降,我理解是正常的。

不过搜相关中文文章的时候,我也有点摸不着头脑。网上中文文章介绍的时候,都拿控制多线程下多个 http 请求在控制器作用下,最终一定会按指定顺序执行。我理解要保持最终顺序固定,最简单的做法应该是把线程数设置为 1,那这一个线程就会自动从第一个开始执行,执行完一个再执行完下一个,这样顺序就一定是固定的(因为只有一个线程,一定是串行不存在并行)。搞多线程,然后加锁去保障所有请求不并行执行,实在看不懂是为了啥。

最后,你这里的场景,我理解应该类似于每条记录要先写后读。如果每个线程的记录都是分开而不是独占的,那保障单个线程内顺序执行就可以,没必要保障多个线程一起跑时,还需要顺序执行。

修改接口是要锁 的数据吧? 将锁改为 修改接口需要的东西 试试

baicai 回复

已解决感谢

陈恒捷 回复

谢大佬,已解决,经研究发现这个控制器就是为了让线程按顺序执行,也就是前一个线程没有完成,会加锁,无法执行下一个线程,某些场景会用到,设置单个线程并发达不到压测的目的,可以通过给锁名称定义变量来实现每个线程互不影响的去压测

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册