发现很多TIME_WAIT连接,但是进程fd正常,connect 返回-1时候errno==99 Cannot assign requested address的解决办法
今天多进程导数据时候,遇到一个问题,现象是 多进程跑一会,所有进程开始connect 返回-1 同时errno==99 Cannot assign requested address。看每一个进程的fd是正常的 各种方法检测到,确认没有fg泄露迹象!但是netstat时候发现大量的TIME_WAIT连接,端口被占完了,是导致connect 返回-1 同时errno==99 Cannot assign requested address的原因。
网络搜索得到一个解释:客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”
其实书上看过 close时候只是把fd的使用数-1,但是还没有回收链接,这时候需要修改系统参数,快速回收使用数已经为0 的链接(即正常close的df)。
解决办法:
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
执行此命令后 茫茫多的进程终于正常了...
(还有一个 sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用)