SpringBoot应用压测适配配置咨询及BindException问题排查
问题分析与解决方案
先解决当前的端口耗尽错误
你遇到的java.net.BindException: Address already in use: connect是JMeter所在客户端机器的本地端口耗尽导致的:短时间内大量请求创建新TCP连接,用完了可用的本地端口,且处于TIME_WAIT状态的端口没及时复用。解决方法如下:
- 调整JMeter连接复用配置:在HTTP请求采样器中勾选「使用keep-alive」,让JMeter复用TCP连接,避免每次请求新建连接消耗端口。
- 修改客户端机器TCP参数(以Linux为例):
- 允许复用TIME_WAIT状态的端口:
sysctl -w net.ipv4.tcp_tw_reuse=1 - 扩大本地可用端口范围:
sysctl -w net.ipv4.ip_local_port_range="1024 65535" - 若需要永久生效,把上述参数写入
/etc/sysctl.conf后执行sysctl -p。
- 允许复用TIME_WAIT状态的端口:
- 调整JMeter压测节奏:不要瞬间启动100线程,设置合理的「Ramp-Up Period」(比如300秒)让线程缓慢启动,避免短时间内端口耗尽。
SpringBoot压测优化配置
针对压测场景,建议调整以下应用配置(以application.properties为例):
1. Web容器优化(默认Tomcat)
# 最大并发连接数,根据服务器硬件调整 server.tomcat.max-connections=8192 # 线程池最大线程数,推荐值为CPU核心数*2 + 20左右 server.tomcat.threads.max=200 # 核心线程数,保证基础并发处理能力 server.tomcat.threads.min-spare=50 # 连接超时时间,避免无效连接占用资源 server.tomcat.connection-timeout=20000 # 启用TCP长连接,复用服务端连接 server.tomcat.tcp-keep-alive=true # 等待队列大小,线程池满时请求进入队列等待 server.tomcat.accept-count=1000
如果使用Undertow容器,配置示例:
server.undertow.io-threads=20 # IO线程数,一般等于CPU核心数 server.undertow.worker-threads=200 # 业务处理线程数 server.undertow.max-connections=8192
2. JVM参数优化
在应用启动脚本中添加以下参数:
java -Xmx4g -Xms4g -XX:+UseG1GC -XX:MaxDirectMemorySize=2g -jar your-app.jar
-Xmx/-Xms:设置堆内存大小,根据服务器内存调整(比如8G内存的服务器可设为4G)+UseG1GC:使用G1垃圾收集器,减少GC停顿时间MaxDirectMemorySize:调整直接内存大小,适配NIO场景
3. Spring业务优化
- 关闭不必要的自动配置(如不需要安全模块):
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration - 优化Jackson序列化:
spring.jackson.serialization.write-date-timestamps-as-nanoseconds=false spring.jackson.deserialization.fail-on-unknown-properties=false - 启用缓存(业务允许的情况下):用Redis缓存热点数据,减少DB查询压力:
spring.cache.type=redis spring.redis.host=your-redis-host spring.redis.port=6379
内容的提问来源于stack exchange,提问作者mc ser
相关产品推荐
相关产品推荐

