短时间大量connect()返回errno 99: cannot assign request address

本文介绍了解决Ubuntu系统中大量文件传输时出现的Socket TIME_WAIT状态问题的方法。通过调整内核参数tcp_timestamps和tcp_tw_recycle,加速了Socket的释放过程,避免了因socket资源耗尽而导致的新连接无法建立的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题出现在一个批量上传文件的客户端程序里,系统是Ubuntu 15.04.

测试采用的是解压缩的linux kernel 文件夹。由于linux kernel 里存在大量的小文件,才用短链接,每次close()之后有大量的socket处于TIME_WAIT状态,而没有释放,这导致客户端 socket被用完,当新的connect()产生时,分配不到socket.

解决方法是,修改以下两项内核参数,来加速socket的释放

sudo sysctl -w net.ipv4.tcp_timestamps=1
sudo sysctl -w net,ipv4.tcp_tw_recycle=1

不过下面这篇文章有关于是否应该设置的讨论,供设置是参考:

http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html


最终问题解决了,解决方式是使用一个Socket来处理目录下所有文件,对每一个文件开一个Socket,端口迟早会用完。

### HTTPX 连接错误解决方案 当遇到 `httpx.ConnectError` 错误提示 `[Errno 99] Cannot assign requested address` 时,这通常意味着操作系统无法找到可用的本地端口来建立新的网络连接[^4]。 对于此类问题的一个常见解决办法是调整操作系统的参数设置以增加可使用的端口号范围。可以通过修改 `/proc/sys/net/ipv4/ip_local_port_range` 文件中的配置实现这一点: ```bash sudo echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range ``` 上述命令将允许更广泛的端口被用于新建连接,从而可能缓解由于端口耗尽引起的问题。 另外一种可能是防火墙或其他网络安全策略阻止了某些特定IP地址或端口上的通信尝试;因此建议检查并适当放宽这些限制条件(如果安全政策允许的话)。同时也要确认目标服务确实正在监听预期的主机名/IP 地址以及相应的端口上,并且该位置可以从当前设备访问到[^1]。 为了进一步排查问题所在,还可以考虑使用工具如 `netstat`, `ss` 或者 `lsof` 来查看是否有过多处于 TIME_WAIT 状态的TCP连接占用资源,必要时通过降低TIMEOUT时间等方式加快释放不再需要的半开连接[^3]。 最后,在编写应用程序代码方面,应当合理控制并发量大小,避免一次性创建过多未完成的任务实例而导致系统资源过载。例如采用异步I/O模型配合合适的最大并发数限制能够有效提高效率的同时减轻对底层网络设施的压力[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值