性能常识 jmeter 压测结果平均时间是 30 多秒,但是我在压测期间页面操作又很快(1-2)秒这是为什么呢?

啊神 · 2024年11月15日 · 最后由 yuejiwen 回复于 2024年11月25日 · 9866 次阅读

这是我问大模型的一个模板,但是大模型的回答有点答非所问,让我去排查一下服务器资源:
你是一名 JMETER 性能专家,我现在提供一些压测场景,请根据我的脚本设置和压测结果回答我的场景问题。如果你还需要什么样的数据请向我获取。
我正在使用 jmeter 压测一个上传功能接口,脚本设置:jmeter 的设置是线程数 30,Ramp-up 是 1 秒,脚本持续运行 300 秒
压测结果:样本数 271,平均值 34434,吞吐量 50.3/Min,发送 860KB/sec
回答我以下场景问题:现在我在压测期间对上传文件接口进行上传操作,上传的文件和压测的文件一样,在页面上传这个文件只需要 1-2 秒。但是在压测结果中的平均时间需要 30 多秒,这是为什么
这是结果:


这是性能配置:

压测页面操作时间:

应用服务器资源:CPU 40%, MEM:50%
数据库服务器资源:CPU 5%, MEM:50%
所以想请社区的大佬分析一下

共收到 27 条回复 时间 点赞

我的第一想法是两者监听不一致,页面响应是正确的,上传类做了异步处理,提前响应;接口调用是监听的文件完成上传过程,也是正确的

1、脚本方便截图贴一下吗?
2、有没有 Once Only Controller 仅一次控制器,登录接口只运行一次即可;
3、上传功能接口有没有写断言?如有,建议去掉

30 个并发 30 多秒。感觉是文件上传接口是单线程处理的,没有使用线程池。

页面那个响应只是表示你调用成功吧,并不代表已经上传完成,jmeter 压的是直到上传完成

  1. 你网页版看的时候,是脚本正在运行的时候么?
  2. 看看脚本有么有等待时间
  3. 最好脚本有截图,确定只是一个 upload 的请求
  4. 可以看后台日志的时间,确定这么多请求没有出现排队现象
  5. 压测不能看平均时间

看了你 2 个截图,有个数据挺有意思的:

  1. 你压测时,统计到的数据发送量是 860KB/sec
  2. 压测时,响应时间最小值是 3 秒多
  3. 你压测同时试验的时候,1 个请求大约 1 秒完成,发送量接近 460B/sec。

有个数没对上:
每秒传输的文件数,按传输量统计,每秒大概有 860*1000/460=1869 个。
但按 qps 算,每秒完成的请求数不到 1 个。
这个差距非常大,没太能想象出到底是什么原因(也许实际传的文件不是同一个?)

建议可以试下:
1、用同一台机器,在 jmeter 压测时,进行手动上传,看看效果(排除网络条件不同,导致的结果差异)
2、在被测机上,也看下压测期间接口 qps 和响应时间数据,看和 jmeter 差距如何

方便的话,建议你把 jmeter 的脚本贴上来,现在的线索还是太少了。

应大家要求,上传了脚本:

陈恒捷 #6 回复

460B 这个不是发送的大小,是浏览器接收的大小=Jmeter 中的 0.38KB/sec

可以在清晰描述一下吗,没看懂😂

啊神 #10 · 2024年11月18日 Author

1、脚本回复已贴
2、登录是运行一次,但我是 30 个虚拟用户,所以是登录 30 次
3、断言响应应该影响不大的。

啊神 #11 · 2024年11月18日 Author
testhome2b #5 回复

你网页版看的时候,是脚本正在运行的时候么?
看看脚本有么有等待时间
最好脚本有截图,确定只是一个 upload 的请求
可以看后台日志的时间,确定这么多请求没有出现排队现象
压测不能看平均时间
1、是
2、无
3、回复已贴脚本
4、后台怎么能看到排队的现象?监控过应用日志,日志一直在刷
5、~

1 秒发起了 30 个线程请求,但是你的接口本来调用一次需要快 1 秒,这个时候其他的请求就处于等待状态,响应时间就越来越长了呗

你手工上传和跑 JMeter 的是同一台电脑吗?JMeter 发送 800 多 KB/s 会不会是达到带宽上限了?

啊神 #9 回复

针对上传类接口,通常会采用异步处理的方式来提高用户体验,即前端请求后后端立即返回响应,但上传操作还在后台进行中。
我的意思是:
1.两者响应时间过大,可能是前端你只关注到响应返回,而非文件上传完成。
2.Jmeter 则是监控的全流程,即请求上传到文件上传完成后的完整流程

可以打开浏览器的控制台看下整个请求响应返回的整体时间,应该你和的 jmeter 差不多了多少,你描述的场景只是看到浏览器上传成功的表像,后台还没处理文件呢

问问你的开发和运维同事,是不是对来自移动端的同一个 ip 的上传做了线程限制……看代码、看 nginx 配置

啊神 #11 回复

把运行那段时间相关日志,下载下来, 如果里面没有体现出等待时间。就拿请求结束的时间减去请求开始的时间。
如果你是 30 个并发, 后台最大支持 20 个并发, 那么就有 10 个并发需要等待前面处理完

深深 #15 回复

chrome 里面的 network 就是从浏览器发出请求到 服务器返回给浏览器的时间

啊神 #19 · 2024年11月21日 Author

1、我们的上传业务会返显到前端,上传成功后前端页面会返显这个上传的文件名称,文件大小等信息。所以接口上传成功就是代表文件已经上传到服务器了。

啊神 #20 · 2024年11月21日 Author

我们的上传业务会返显到前端,上传成功后前端页面会返显这个上传的文件名称,文件大小等信息。所以接口上传成功就是代表文件已经上传到服务器了。

啊神 #21 · 2024年11月21日 Author
Zhang Jia #13 回复

不是同一台机子,但我也怀疑是宽带问题,但是我们的带宽也有 10M,应该是够的...

啊神 #22 · 2024年11月21日 Author
槽神 #16 回复

排除过了,测试环境不会做这个限制

啊神 #21 回复

破案了。10M 的带宽理论传输速度是 1.25MB/s,再加上网络损耗,设备原因等影响,并发情况下 800 多 KB/s 也属于正常。可以判定为网络限制导致。

jmeter tps 换算成耗时: 1 / (48.3 / 60) = 1.24s,和你标题的描述的手工 1~2 应该比较相符

上传有什么好测的,另外上传为什么会消耗 40%CPU?

文件上传时如果文件的读写不存在瓶颈的话,基本都会占满可用带宽。你手工上传需要 1~2 秒的话,手工 1 分钟也最多上传 30~60 次,与 JMeter 每分钟完成 48.3 次上传相符。
由于 JMeter 设置了 30 个线程,30 个线程就会分时交替使用网卡去传输,所以每个线程耗时就达到了手工的 30 倍。相当于有 30 个进度条,每个进度条都是慢的,总速度是快的。
如果你把线程数设为 1,结果估计是:吞吐量和样本数基本不变,响应时间缩短到 1~2 秒。

有一定概率是异步处理的,页面是需要等待异步处理完成,但是接口仅需要产生消息即可

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册