Critical Section Controller (临界部分控制器) 到底该如何用?

原文链接:Critical Section Controller (临界部分控制器) 到底该如何用?[原创] - 测试派

有同学在使用jmeter做性能测试的时候,有这样一个诉求,就是一个完整的业务包含多个接口请求,且有先后顺序。在做性能测试的时候,要求接口请求顺序永远按照自己定义好的请求顺序执行。

于是,他就在jmeter中线程组下按顺序添加了多个接口请求取样器,模拟并发请求调试。看到效果如下图(图一):

image.png

728 x 397 1518 x 828

脚本调试是通了,但是,他看到查看结果树中显示请求结果数据好像不是按照顺序请求(没有仔细去分析,根据结果自认为的),认为这样不符合自己的诉求,于是开始寻找新的办法。通过长时间的摸索,终于找到了一个貌似能解决的办法,增加一个critical section controller(临界部分控制器),认为增加一个锁,能控制执行顺序。于是修改脚本生成如图(图二):

image.png

728 x 397 1518 x 828

看到 查看结果树中显示的请求顺序与预期一致,是按照接口的顺序执行的,于是认为这样就是正确的。

但是,不知道大家看了这两个图后,有没有注意一个细节?

第一种方式:

image.png

728 x 334 1199 x 550

image.png

728 x 255 1223 x 428

第二种方式:

image.png

728 x 338 1197 x 555

image.png

728 x 270 1226 x 454

第一种方式,整个执行过程只用了4秒种,第二种方式,执行过程耗时13秒,汇总报告中的吞吐量是按每分钟计算。*

这句话什么意思呢?就是说,第二种方式,虽然眼睛是看到了查看结果树中的数据是按照自定义的顺序执行的,但是执行时间远远大于第一种方式,换句话说,服务器的压力要远远小于第一种方式人为的方式导致性能测试指标值错误

哪我们应该怎么做呢?

首先,对于这样一种,遇到问题时,自主思考和学习的行为能力,还是值得表扬和肯定的。只是,需要学习的时候,再深入一点点,再细致一点点。

接下来,我们讲讲该怎么做。首先,我们要知道,在jmeter中,同层级无逻辑控制器控制的取样器,执行顺序是从上往下,顺序执行的。这句话,怎么理解?在我们单个用户脚本调试阶段,执行顺序是从上往下;在多用户并发时,每一个并发用户(线程),也都是从上往下执行的,只是因为是并发,同一时刻,可能有不同用户(线程)做完了不同接口请求,查看结果树只是按照完成时间的先后显示请求结果。为了验证我说的这句话,我们可以再看下下图(图三)

image.png

728 x 397 1518 x 828

从查看结果树中,我们看ThreadNum号想同的请求,请求的顺序是不是都从sample1 到 sample3。这样,其实已经满足了预期诉求。

哪critical section controller(临界部分控制器)到底怎么用呢?我们先看下官方给我们的解答:

image.png

665 x 112

临界部分控制器确保其子元素(采样器\控制器等)将仅由一个线程执行,在执行控制器的子元素之前先命名一个锁锁定。

image.png

728 x 131 1109 x 200

说直白点,就是并发请求(线程)这个控制器时,会先根据‘锁名称’生成一个‘锁’,锁定控制器下的所有子元素,等到所有子元素都执行完‘锁’才会释放,下一个请求(线程)才能执行,即,把原本的并发请求的并行处理方式,变成了串行处理。所以,就会看到上面我们说到的第二种方式的时间远远大于第一种方式。哪如何让critical section controller 可以并行处理呢?我们再看看官方给的解释,它说的是,线程执行时,先根据‘锁名称’生成锁,串行,是因为锁名称相同,已经被占用,无法生成新的锁,所以只能等待锁的释放,哪我们是不是可以考虑让锁名称变成动态的呢?每个线程要用的时候,生成一个新的锁名称而且不重复,是不是就可以并行处理了。想要锁名称变成动态,方法很多,使用随机数函数、使用时间戳函数、使用线程数函数......, 是不是很多,只要用个自动生成值的函数就可以。

image.png

728 x 397 1518 x 828

这个,就是修改了critical section controller的锁名称为动态值,当某个线程调用时,就会自动生成一个新的锁名称。看最后执行的时间5秒,汇总报告中的吞吐量,是不是和第一种方式基本相同?

当然,有的同学比较追求完美,就是想看到最后的结果一定要按顺序展示。没问题,满足你的要求。

image.png

728 x 397 1518 x 828

是不是,看到结果也是你指定的顺序,执行的时间也和第一种相同,最后的汇总报告中,看到了一个事务总数据。

好了,critical section controller(临界部分控制器)的使用,你是否已经掌握了呢?



作者:Allen
链接:http://testingpai.com/article/1595507267745
来源:测试派
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常表示在控制器中无法进入临界区(critical section)。临界区是一段代码,只能同时由一个线程执行,以避免竞态条件和数据不一致性。 出现这个错误的原因可能是以下几种: 1. 死锁(deadlock):如果多个线程都试图同时访问临界区,但由于互斥锁(mutex)或其他同步机制的问题,导致它们无法进入临界区,就会发生死锁。检查你的代码是否存在死锁的情况。 2. 锁竞争(lock contention):如果多个线程同时试图获取同一个锁,就会发生锁竞争。这可能导致某些线程无法进入临界区。尝试优化你的代码以减少锁竞争。 3. 资源耗尽:如果你的系统资源(如内存、文件句柄等)不足,可能导致无法进入临界区。检查你的系统资源使用情况,并确保它们得到正确管理和释放。 4. 代码错误:有时,代码中可能存在逻辑错误或其他问题,导致无法进入临界区。仔细检查你的代码逻辑,并使用调试工具进行排查。 要解决这个问题,你可以尝试以下几种方法: 1. 仔细检查你的代码并确保正确实现了临界区的互斥访问。 2. 使用适当的同步机制,如互斥锁(mutex)、信号量(semaphore)等,来控制对临界区的访问。 3. 检查系统资源的使用情况,并确保合理分配和释放资源。 4. 运行代码调试工具,以找出潜在的逻辑错误或其他问题。 如果你能提供更多关于你的控制器代码和错误信息的细节,我可以为你提供更具体的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值