SpringBoot REST服务无法达到预期负载的问题排查求助
SpringBoot极简服务TPS无法突破400问题排查
我有个SpringBoot应用扛不住预期负载,为了隔离问题,做了个极简服务——仅休眠500ms后返回成功响应,但无论怎么调整Tomcat或SoapUI配置,应用的TPS始终无法超过400。
服务端Tomcat配置
server: tomcat: protocol: org.apache.coyote.http11.Http11NioProtocol accesslog: enabled: false max-connections: 10000 threads: max: 1000 min-spare: 1000 accept-count: 1000
已通过Jconsole连接进程,确认min-spare线程配置已生效。
SoapUI负载测试配置
Thread: 5000 (5000 concurrent users) Strategy: Simple Test Delay: 0 Random: 0
测试结果
min: 500 max: 959 avg: 510 tps: 386 err: 0
问题分析与优化方向
1. 排查SoapUI客户端瓶颈
5000并发线程可能超出SoapUI的处理能力,导致客户端无法发起足够请求。SoapUI基于Java,默认堆内存有限,大量线程会引发内存不足或线程阻塞:
- 调大SoapUI的JVM堆内存(修改安装目录下的
soapui.vmoptions文件,比如设置-Xms4g -Xmx4g) - 换用JMeter等专业压测工具对比测试,排除客户端限制
2. 操作系统层面限制
客户端和服务端的系统参数可能限制了并发连接数:
- 服务端:检查Linux文件句柄限制,执行
ulimit -n确保值大于10000,可通过ulimit -n 65535临时调整,或修改/etc/security/limits.conf永久生效 - 客户端:短时间大量连接会导致TIME_WAIT端口耗尽,可调整系统参数开启端口复用(
net.ipv4.tcp_tw_reuse=1)、缩短TIME_WAIT超时时间(net.ipv4.tcp_fin_timeout=30)
3. Tomcat NIO参数优化
当前仅配置了线程数和连接数,NIO的acceptor/selector线程数可能成为瓶颈:
- 添加以下配置调整线程数(根据CPU核心数调整,比如4核CPU可设置):
server: tomcat: acceptor-threads: 4 selector-threads: 8
4. 排除网络瓶颈
将压测工具部署到服务端本地执行,排除跨网络的带宽、延迟影响。如果本地压测TPS正常,说明问题出在网络链路。
5. JVM参数优化
检查JVM GC日志,若存在频繁Full GC或长停顿,会影响服务处理效率:
- 调整堆内存大小(如
-Xms4g -Xmx4g) - 使用低停顿垃圾收集器(如G1GC,添加参数
-XX:+UseG1GC)
内容的提问来源于stack exchange,提问作者ppatidar
相关产品推荐
相关产品推荐

