You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JMeter压测TPS波动异常咨询:50并发用户TPS未达目标

问题分析与解决方案

咱们来拆解你遇到的两个核心问题:两个测试场景TPS不一致,以及目标TPS10未达成且图表呈锯齿状。这在JMeter性能测试里是很常见的情况,下面逐个分析:

为什么两个场景TPS不一致?

你的两个场景用了完全不同的流量控制逻辑,这直接导致了TPS差异:

场景1:Constant Timer(5秒固定定时器)

这个定时器是在每个请求执行完成后强制等待5秒,也就是说每个线程的请求周期是「请求响应时间 + 5秒」。理论上如果响应时间为0,50个线程的TPS应该是 50 / 5 = 10,但实际中响应时间不可能为0,所以每个线程的实际请求周期会超过5秒,总TPS自然会低于理论值。而且这个逻辑是给每个线程单独加固定延迟,和服务器的处理能力绑定较弱。

场景2:仅Ultimate Thread Group(终极线程组)

终极线程组的作用是控制线程的启动数量、速率和持续时间,但它没有对「请求发送间隔」做限制。线程启动后会尽可能快地发送请求(除非你加了其他定时器),此时TPS完全取决于服务器的处理速度和客户端的发送能力——和场景1的“固定间隔+响应时间”逻辑完全不同,所以TPS数值自然不一致。

为什么达不到目标TPS10,且TPS呈锯齿状?

1. 固定定时器的先天局限性

Constant Timer的“固定5秒等待”是在请求完成后触发,而不是严格控制“每5秒发送一个请求”。如果服务器响应时间有波动(比如有时候0.2秒,有时候0.5秒),每个线程的请求周期就会变成5.2秒或5.5秒,总TPS就会跟着波动,形成锯齿状。而且只要响应时间不为0,总周期就会超过5秒,TPS必然低于10。

2. 资源瓶颈或调度波动

  • 客户端瓶颈:JMeter所在机器的CPU、内存、网络带宽可能不足以支撑50线程按预期发送请求(比如CPU使用率过高,导致线程调度延迟)。
  • 服务器瓶颈:服务器的处理能力不足(比如CPU、内存、数据库连接池耗尽),导致响应时间变长,进一步拖慢了整体请求节奏。
  • 线程调度波动:操作系统对JMeter线程的调度本身就有随机性,偶尔的调度延迟也会导致请求发送时间不一致,反映在TPS图表上就是锯齿。

3. 流量控制方式选错了

Constant Timer适合模拟用户的思考时间,但不适合精准控制TPS。如果你想严格达到目标TPS10,应该用Constant Throughput Timer(固定吞吐量定时器)——它会根据当前实际TPS动态调整请求间隔,抵消响应时间的波动,让TPS更稳定。

解决建议

  • 替换定时器类型:把Constant Timer换成Constant Throughput Timer,设置目标TPS为10。这个定时器会自动计算每个请求的等待时间,确保整体吞吐量稳定在目标值附近。
  • 排查资源瓶颈:用JMeter的PerfMon插件监控客户端和服务器的CPU、内存、网络、磁盘IO,确认是否有资源耗尽的情况。
  • 优化线程组配置:如果坚持用Ultimate Thread Group控制流量,需要根据服务器平均响应时间计算线程数——比如平均响应时间是0.8秒,那么需要 10 * 0.8 = 8 个线程(无思考时间)就能达到TPS10,但这种方式不如吞吐量定时器精准。
  • 排查服务器端波动:检查服务器日志、数据库查询性能、负载均衡策略等,确认是否有导致响应时间波动的因素(比如慢SQL、缓存失效)。

内容的提问来源于stack exchange,提问作者Bal Kishan

火山引擎 最新活动