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保活时间(秒)
  1. 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 工具优化建议

  1. 连接池与线程配置
    使用 HTTP 连接池
    在 JMeter 的HTTP请求中勾选 “Use keep-alive”,复用 TCP 连接,减少端口消耗。
    控制线程并发策略
    避免瞬间启动大量线程(如线程数=1000+ramp-up时间=1秒),建议通过渐变式加压(如每分钟增加 200 线程)观察端口占用趋势。
    配置超时时间:在HTTP请求中设置Connect Timeout和Response Timeout(如 5000ms),避免长连接阻塞。
  2. 分布式压测架构调整
    分离控制机与负载机
    若单机端口不足,采用分布式压测:
    控制机(Master)仅负责调度,不生成压力;
    负载机(Slave)部署多台,每台承担部分线程(如每台 500 线程),减少单台端口压力。
    负载机系统优化
    每台负载机均需执行 Windows/Linux 端口优化步骤(如MaxUserPort、TcpTimeWaitDelay等),确保多机协同高效。

四、其他维度优化与验证

  1. 服务端代码优化
    连接池管理
    若接口涉及数据库或 HTTP 调用,需配置合理的连接池参数(如 HikariCP 的maxPoolSize、idleTimeout),避免连接泄漏导致端口耗尽。
    异步非阻塞设计
    对高并发接口采用异步框架(如 Spring WebFlux、Netty),减少线程阻塞和连接占用。
  2. 监控与问题定位工具
    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 连接,避免短连接滥用。
分布式负载均衡:通过多机压测分摊单节点端口压力。

通过以上多维度优化,可有效解决压测中的端口占用问题,提升系统的并发承载能力。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐