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
相关产品推荐
相关产品推荐

