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

这个问题出现在一个批量上传文件的客户端程序里,系统是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,端口迟早会用完。

你可能感兴趣的:(linux,socket)