jmeter java request_JMeter的JavaRequest探究

favicon.ico摘要:

调整父字节计数和结束时间。我们代码中用的是addSubResult(SampleResultsubResult,booleanrenameSubResults),笔者又调整了代码:执行结果:ok,执行成功(出现Log4j2异常是因为笔者没有配置log4j2.xml,不要在意这个细节),但总感觉还是缺点什么?为了更真实笔者有微改了下代码:OKay,打包到JMeter运行如下:笔者在看聚合报告时,又遇

1.背景

最近笔者的一位老朋友咨询了一个问题:在自定义的Java请求中如何编写多个请求?老朋友反应他们发送请求只能基于这种Java请求形式(代码调需用三方封装的jar包)。这个问题恰巧不久前在笔者所在的飞测QQ群中有人咨询过,当时只回答了用SubResult.

lockedm=-1G7:status=4(sleep)m=-1lockedm=-1G8:status=4(sleep)m=-1lockedm=-1G9:status=4(sleep)m=-1lock

2.目的

本次的目的就是深挖下:JMeter的JavaRequest请求如何编写过个SamplerResult。

。下面演示使用Golang强大的GODEBUG环境变量可以查看当前程序中Go调度器的状态:环境为Windows10的Linux子系统(WSL),WSL搭建和使用的代码在learn-golang项目有整

3.实战

笔者在之前已经多次写过Java请求脚本,本次如何搭建脚本编写环境就及Java请求中有哪些约定好结构本文不赘述,大家自行百度下。其实主要还是讲思路,包括以后笔者写文章大都主要是讲解决问题的思路。

CHED17190ms:gomaxprocs=4idleprocs=2threads=8spinningthreads=0idlethreads=5runqueue=0[0000]SCHED18193

碰到这个问题,我第一时间想到的是用SubResult(因为笔者长期研究JMeter底层源码)

然后就开始撸代码:

=0dying=0spinning=falseblocked=truelockedg=-1G1:status=4(semacquire)m=-1lockedm=-1G2:status=4(forceg

da512729-fad6-4fdf-bbf7-5a105ddd8742.jpg

2f17bb4d-c7e0-442b-b694-57cf97a546d7.jpg

恩,感觉很完美!然而在执行后:

ptoff=locks=0dying=0spinning=falseblocked=truelockedg=-1M3:p=-1curg=49mallocing=0throwing=0preemptof

6b700f74-f5ff-426b-80f9-34d7f88442c2.jpg

从上图看出,抛出了:sampleEnd called twice 异常,笔者将代码做了微调:

9b34b07c-2a14-4771-9e83-f1dc0ab9bc84.jpg

恩,感觉应该没问题了,再次执行下:

5a8fbc54-8c70-4b6e-9c46-5278dff1cf1a.jpg

我擦,咋又报错了。。。这次报了setEndTime must be called after setStartTime ,笔者于是看了JMeter底层代码,看看哪里抛出的这个异常。如下图:

f3779556-589e-4f67-a4c3-097c8f82587b.jpg

恩? startTime值为零才会抛出这个异常,感觉越来越有意思了。带着这个疑问笔者去查看了JMeter的API文档,这才发现导致此现象的真凶。

b6f797bf-ce3c-4b70-a266-068f9d71a4ca.jpg

当回翻译官:

ult,booleanrenameSubResults),笔者又调整了代码:执行结果:ok,执行成功(出现Log4j2异常是因为笔者没有配置log4j2.xml,不要在意这个细节),但总感觉还是缺点什

向集合中添加子结果,而不更新任何父字段。

添加子结果并调整父字节计数和结束时间。

addSubResult(SampleResult subResult, boolean renameSubResults)

添加子结果并调整父字节计数和结束时间。

我们代码中用的是addSubResult(SampleResult subResult, boolean renameSubResults),笔者又调整了代码:

a6ae011e-4205-45d6-be85-9b43561f0074.jpg

执行结果:

k=1m=-1runqsize=0gfreecnt=0P1:status=0schedtick=2syscalltick=1m=-1runqsize=0gfreecnt=0P2:status=0sch

e5c1b53b-6245-4d7a-84d1-74c9fe11d733.jpg

ok,执行成功(出现Log4j2异常是因为笔者没有配置log4j2.xml,不要在意这个细节),但总感觉还是缺点什么?为了更真实笔者有微改了下代码:

分配状态)位于P,所以G可以跨M调度,不再存在跨M调度局部性差的问题G是抢占调度。不像操作系统按时间片调度线程那样,Go调度器没有时间片概念,G因阻塞和被抢占而暂停,并且G只能在函数调用时有可能被抢占

97fb40c8-075b-45ab-94a9-e23e5af82b7a.jpg

344da2f1-eeac-4c19-8b76-cb9af0954844.jpg

OKay,打包到JMeter运行如下:

期研究JMeter底层源码)然后就开始撸代码:恩,感觉很完美!然而在执行后:从上图看出,抛出了:sampleEndcalledtwice异常,笔者将代码做了微调:恩,感觉应该没问题了,再次执行下:我擦

8d2c9f20-2959-4823-bc50-d034a3a68877.jpg

6599abd0-95b2-4612-b9b9-1542310eabcb.jpg

笔者在看聚合报告时,又遇到问题了。。。

总线程数M,包括在执行G的和空闲的spinningthreads=0处于自旋状态的线程,即M在绑定的P的局部队列和全局队列都没有G,M没有销毁而是在四处寻觅有没有可以steal的G,这样可以减少线程的

3ab1c27c-b6c4-459e-8e11-883a7405741b.jpg

恩?只显示父请求聚合数据,咋不显示子请求数据呢?笔者目前发现解决办法是:执行的时候先保存JTL结果见文件,场景结束后再次用聚合报告打开此JTL结果文件。

P代表逻辑processor,现在G的眼中只有P,在G的眼里P就是它的CPU。并且给每个P新增加了局部队列来保存本P要处理的goroutine。这个模型的调度方法如下:每个P有个局部队列,局部队列保存

27390d9d-4807-4418-ae26-5bb3d3b86ab4.jpg

okay,最终问题解决。。。如果大家发现更好的解决方式,请不吝赐教!

idlethreads=6runqueue=0[0000]SCHED22219ms:gomaxprocs=4idleprocs=4threads=8spinningthreads=0idlethrea

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值