这个问题出现在一个批量上传文件的客户端程序里,系统是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,端口迟早会用完。
本文介绍了解决Ubuntu系统中大量文件传输时出现的Socket TIME_WAIT状态问题的方法。通过调整内核参数tcp_timestamps和tcp_tw_recycle,加速了Socket的释放过程,避免了因socket资源耗尽而导致的新连接无法建立的问题。

3953

被折叠的 条评论
为什么被折叠?



