jmeter压力测试报错:java.net.BindException: Address already in use: connect解决方案
1.压测初期在压测某一接口时,2分钟后jmeter报错如下:java.net.BindException: Address already in use: connect2.查询信息得知压力测试过程中本地TCP/IP被占满,故对本地配置进行修改;3.修改windows本地配置信息:3.1 设置MaxUserPort数量:(1)使用win+R打开cmd,输入regedit命令打开注册表(2)找到在
·
1.压测初期在压测某一接口时,2分钟后jmeter报错如下:
- java.net.BindException: Address already in use: connect
2.查询信息得知压力测试过程中本地TCP/IP被占满,故对本地配置进行修改;
3.修改windows本地配置信息:
3.1 设置MaxUserPort数量:
- (1)使用win+R打开cmd,输入regedit命令打开注册表
- (2)找到在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters右键Parameters;
- (3)添加一个新的DWORD,名字为MaxUserPort;
- (4)然后双击MaxUserPort,输入数值数据为65534,基数选择十进制;(如果是分布式运行的话,控制机器和负载机器都需要这样的操作)
3.2 深入研究提高端口的使用效率:
- windows下的端口Time_wait&close_wait导致端口无法使用
3.2.1Time_Wait解决方案:设置TcpTimeWaitDelay参数:
- (1)重复以上步骤1,2
- (2)添加一个新的DWORD,名字为TcpTimeWaitDelay,将值设置为30,缩短TIME_WAIT等待时;
- 注:只设置MaxUserPort,TcpTimedWaitDelay 直接压测仍然会导致同一报错,那怕将TcpTimedWaitDelay 设置最大300也会出现端口占用的问题
3.2.2Close_Wait解决方案:
- Close_wait会占用一个连接,网络可用连接小。当数量过多时,可能会引起网络性能下降,并占用到系统非换页内存,尤其时在有连接池的情况下(比如Httprequest),会耗尽连接池的网络连接数,导致无法建立网络连接。
- 设置Keepalive参数:
- (1)使用win+R打开cmd,输入regedit命令打开注册表
- (2)找到在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters右键Parameters;
- (3)“KeepAliveTime” = DWORD:006ddd00
- (4)“KeepAliveInterval” = DWORD:000003e8
- (5)“MaxDataRetries” = “5”
3.3 配置TcpNumConnections参数
+ (1)TcpNumConnections= 16777214
+ (2)MaxHashTableSize = 65536
+ (3)MaxFreeTcbs = 16000
3.4 以上设置完毕后重启本地计算机!
4.因本次压测为接口涉及到Nginx反向代理服务器,故需要对NG服务器做如下参数改动:
- 4.1 web服务器的最大连接线程数,调到1024或者2048,后期直接调整至65535(官方默认最大参数设置)
- 4.2 修改内核服务器参数:
目的:加快被占用端口的释放速度
#vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME-WAIT的socket
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME-WAIT的socket
net.ipv4.tcp_fin_timeout = 15 # FIN-WAIT-2状态持续时间(秒)
# 端口与连接优化
net.ipv4.ip_local_port_range = 1024 65535 # 端口范围
net.ipv4.tcp_max_syn_backlog = 8192 # SYN队列长度,处理半连接
net.ipv4.tcp_max_tw_buckets = 500000 # TIME-WAIT最大数量
# 性能调优
net.core.somaxconn = 32768 # socket监听队列最大值
net.core.netdev_max_backlog = 32768 # 网络设备接收队列
net.ipv4.tcp_keepalive_time = 300 # TCP保活时间(秒)
- Nginx 配置增强
# 连接与性能优化
worker_processes 4; # 工作进程数(建议等于CPU核心数)
worker_connections 65535; # 单个进程最大连接数
# 超时与重用
proxy_connect_timeout 300; # 连接后端服务器超时时间(秒)
proxy_send_timeout 300; # 向后端发送请求超时时间(秒)
proxy_read_timeout 300; # 读取后端响应超时时间(秒)
proxy_buffer_size 16k; # 缓冲区大小
proxy_buffers 4 16k; # 缓冲区数量与大小
三、JMeter 工具优化建议
- 连接池与线程配置
使用 HTTP 连接池
在 JMeter 的HTTP请求中勾选 “Use keep-alive”,复用 TCP 连接,减少端口消耗。
控制线程并发策略
避免瞬间启动大量线程(如线程数=1000+ramp-up时间=1秒),建议通过渐变式加压(如每分钟增加 200 线程)观察端口占用趋势。
配置超时时间:在HTTP请求中设置Connect Timeout和Response Timeout(如 5000ms),避免长连接阻塞。 - 分布式压测架构调整
分离控制机与负载机
若单机端口不足,采用分布式压测:
控制机(Master)仅负责调度,不生成压力;
负载机(Slave)部署多台,每台承担部分线程(如每台 500 线程),减少单台端口压力。
负载机系统优化
每台负载机均需执行 Windows/Linux 端口优化步骤(如MaxUserPort、TcpTimeWaitDelay等),确保多机协同高效。
四、其他维度优化与验证
- 服务端代码优化
连接池管理
若接口涉及数据库或 HTTP 调用,需配置合理的连接池参数(如 HikariCP 的maxPoolSize、idleTimeout),避免连接泄漏导致端口耗尽。
异步非阻塞设计
对高并发接口采用异步框架(如 Spring WebFlux、Netty),减少线程阻塞和连接占用。 - 监控与问题定位工具
Windows 端口监控
bash
netstat -ano | findstr “TIME_WAIT” | wc -l # 查看TIME_WAIT状态连接数
tasklist /svc | findstr “端口号” # 定位占用端口的进程
Linux 性能分析
bash
ss -ant | grep TIME-WAIT | wc -l # TIME-WAIT连接数
lsof -i :端口号 # 查看端口占用进程
JMeter 监控插件
使用JMeter Plugins中的Server Status Monitor实时监控负载机的端口使用率、CPU、内存等指标,提前预警资源瓶颈。
五、压测执行策略与验证
1. 分阶段压测流程
单接口基准测试:逐步增加线程数(如 100→500→1000),每阶段保持 10 分钟,观察端口释放是否正常。
混合场景测试:模拟真实业务场景(多接口并发),验证端口在复杂负载下的稳定性。
疲劳测试:持续压测 4 小时以上,验证长时间运行后是否存在端口泄漏。
2. 验证标准
无新增TIME-WAIT连接泄漏:压测结束后,TIME-WAIT连接数应在 5 分钟内降至接近 0。
端口利用率健康:可用端口数(netstat -ano | findstr “ESTABLISHED”)占总端口(65534)的比例应低于 80%。
总结:端口优化核心逻辑
扩大端口范围:通过MaxUserPort增加可用端口总量。
加速端口回收:缩短TIME-WAIT时间(TcpTimeWaitDelay)、启用快速回收(tcp_tw_reuse/recycle)。
减少连接占用:使用连接池复用 TCP 连接,避免短连接滥用。
分布式负载均衡:通过多机压测分摊单节点端口压力。
通过以上多维度优化,可有效解决压测中的端口占用问题,提升系统的并发承载能力。
更多推荐
所有评论(0)