这是我问大模型的一个模板,但是大模型的回答有点答非所问,让我去排查一下服务器资源:
你是一名 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%
所以想请社区的大佬分析一下
我的第一想法是两者监听不一致,页面响应是正确的,上传类做了异步处理,提前响应;接口调用是监听的文件完成上传过程,也是正确的
1、脚本方便截图贴一下吗?
2、有没有 Once Only Controller 仅一次控制器,登录接口只运行一次即可;
3、上传功能接口有没有写断言?如有,建议去掉
30 个并发 30 多秒。感觉是文件上传接口是单线程处理的,没有使用线程池。
页面那个响应只是表示你调用成功吧,并不代表已经上传完成,jmeter 压的是直到上传完成
看了你 2 个截图,有个数据挺有意思的:
有个数没对上:
每秒传输的文件数,按传输量统计,每秒大概有 860*1000/460=1869 个。
但按 qps 算,每秒完成的请求数不到 1 个。
这个差距非常大,没太能想象出到底是什么原因(也许实际传的文件不是同一个?)
建议可以试下:
1、用同一台机器,在 jmeter 压测时,进行手动上传,看看效果(排除网络条件不同,导致的结果差异)
2、在被测机上,也看下压测期间接口 qps 和响应时间数据,看和 jmeter 差距如何
方便的话,建议你把 jmeter 的脚本贴上来,现在的线索还是太少了。
应大家要求,上传了脚本:
你网页版看的时候,是脚本正在运行的时候么?
看看脚本有么有等待时间
最好脚本有截图,确定只是一个 upload 的请求
可以看后台日志的时间,确定这么多请求没有出现排队现象
压测不能看平均时间
1、是
2、无
3、回复已贴脚本
4、后台怎么能看到排队的现象?监控过应用日志,日志一直在刷
5、~
1 秒发起了 30 个线程请求,但是你的接口本来调用一次需要快 1 秒,这个时候其他的请求就处于等待状态,响应时间就越来越长了呗
你手工上传和跑 JMeter 的是同一台电脑吗?JMeter 发送 800 多 KB/s 会不会是达到带宽上限了?
针对上传类接口,通常会采用异步处理的方式来提高用户体验,即前端请求后后端立即返回响应,但上传操作还在后台进行中。
我的意思是:
1.两者响应时间过大,可能是前端你只关注到响应返回,而非文件上传完成。
2.Jmeter 则是监控的全流程,即请求上传到文件上传完成后的完整流程
可以打开浏览器的控制台看下整个请求响应返回的整体时间,应该你和的 jmeter 差不多了多少,你描述的场景只是看到浏览器上传成功的表像,后台还没处理文件呢
问问你的开发和运维同事,是不是对来自移动端的同一个 ip 的上传做了线程限制……看代码、看 nginx 配置
把运行那段时间相关日志,下载下来, 如果里面没有体现出等待时间。就拿请求结束的时间减去请求开始的时间。
如果你是 30 个并发, 后台最大支持 20 个并发, 那么就有 10 个并发需要等待前面处理完
1、我们的上传业务会返显到前端,上传成功后前端页面会返显这个上传的文件名称,文件大小等信息。所以接口上传成功就是代表文件已经上传到服务器了。
我们的上传业务会返显到前端,上传成功后前端页面会返显这个上传的文件名称,文件大小等信息。所以接口上传成功就是代表文件已经上传到服务器了。
破案了。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 秒。
有一定概率是异步处理的,页面是需要等待异步处理完成,但是接口仅需要产生消息即可