You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter压测Python Bottle接口出现Socket未关闭问题

嘿,这个问题我熟!之前帮团队压测Python服务的时候也碰到过一模一样的报错,咱们来一步步捋清楚原因和解决办法:

首先得搞懂这个错误到底是怎么回事:

你看到的java.net.BindException: Address already in use: connect本质是本地客户端端口耗尽——JMeter作为请求发起方,每次和服务端建立TCP连接都会占用一个本地端口,当这些连接关闭后,端口会进入TIME_WAIT状态(Windows默认4分钟,Linux默认2分钟左右),短时间内没法重复使用。如果压测的并发量高、持续时间久,很快就会把系统预留的可用端口池耗干,导致新请求没法创建新连接。

具体解决办法

1. 先优化JMeter本身的连接配置

  • 强制开启HTTP连接复用:在JMeter的HTTP Request Defaults的Advanced标签页里,勾选Use keepalive,同时设置合适的Max Connections per Host和Max Total Connections(比如单主机设200,全局设2000),这样能大幅减少新端口的占用。
  • 缩短超时时间:适当降低Connect Timeout和Response Timeout,避免无效连接长时间占着端口不放。

2. 调整操作系统的TCP参数(核心解决方案)

Windows系统(需管理员权限)

打开命令提示符,执行以下命令修改端口回收规则和范围:

netsh int tcp set global tcpTimedWaitDelay=30
netsh int tcp set global maxUserPort=65534
netsh int tcp set global reuseAddr=enabled
  • tcpTimedWaitDelay:把TIME_WAIT状态的端口保留时长从默认240秒改成30秒,加速端口回收
  • maxUserPort:把可用客户端端口上限从默认的5000左右拉满到65534,直接扩大端口池容量
  • reuseAddr:允许复用处于TIME_WAIT状态的端口

Linux系统

修改/etc/sysctl.conf文件,添加或更新以下参数:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535

然后执行sudo sysctl -p让配置立即生效:

  • tcp_tw_reuse:允许将TIME_WAIT状态的端口复用给新的TCP连接
  • tcp_tw_recycle:快速回收TIME_WAIT状态的端口
  • tcp_fin_timeout:缩短FIN_WAIT2状态的超时时间
  • ip_local_port_range:扩大本地可用端口的范围

3. 优化压测脚本的执行策略

  • 改用梯度加压:别一下子拉满高并发,用JMeter的Stepping Thread Group逐步增加线程数,给系统留足够的端口回收时间。
  • 调整JMeter的全局配置:在JMeter安装目录的bin/user.properties里添加以下配置,强化连接复用:
    httpclient.reuseconnection=true
    httpclient.max_total=2000
    httpclient.max_per_route=200
    

4. 顺便检查服务端(CherryPy)的配置

虽然错误出在客户端,但服务端的设置也可能间接加剧问题:

  • 调整CherryPy的server.thread_pool和server.max_requests参数,避免服务端因连接过载拒绝请求,导致客户端频繁重建连接。
  • 确保CherryPy开启了keep-alive,和JMeter的配置匹配,减少连接重建的次数。

内容的提问来源于stack exchange,提问作者Jeremy Gooch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:58:40