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

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

这是我问大模型的一个模板,但是大模型的回答有点答非所问,让我去排查一下服务器资源:
你是一名 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 的脚本贴上来,现在的线索还是太少了。

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

陈恒捷 回复

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

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

啊神 #10 · 2024年11月18日 Author
此生不换 回复

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

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

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

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

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

啊神 回复

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

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

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

啊神 回复

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

深深 回复

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

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

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

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

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

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

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

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

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

啊神 回复

破案了。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 秒。

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

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