标题:[实践OK]因timewait没快速回收导致的Cannot assign requested address的解决办法 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 26 Jan 2016 13:26:07 +0000 作者:jackxiang 地址:http://jackxiang.com/post/8460/ 内容: 背景:一个队列client的服务器上,有一天运维网络调整后,发现其访问队列状态出现下面的提示: curl "http://101.200.228.135:1218/?name=video&opt=status" [root@XD_xiyou_mqp_10 ~]# telnet 101.200.228.135 1218 Trying 101.200.228.135... telnet: connect to address 101.200.228.135: Cannot assign requested address telnet: Unable to connect to remote host: Cannot assign requested address 根本原因是队列一直在跑,网络调整时出现有些请求因调整没有及时返回,网络可能路很差了,一堆的timewait导致client机上的fd耗尽引发上面的问题, 可以用netstat看下TIMEWAIT情况,发现一大堆的TIMEWAIT,如下图: 点击在新窗口中浏览此图片 http://www.2cto.com/uploadfile/Collfiles/20140816/201408160904132.png 据图得出形成很多TIMEWAIT的原因和网络调整有关,查看命令如下: netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c —————————————————————————————————————————————— 今天想试一下redis,写了个程序,对redis连续进行100000访问,却出现以了Cannot assign requested address的问题,我起先是以为是redis的问题(可能承受不了这么多访问量),可是redis被大家吹的那么NB,不会出现这么SB的问题吧,于 是google之,发现原来是: 客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。 从网上找了解决办法: 执行命令修改如下2个内核参数 sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用 sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收 不过好像只有root用户才能有修改这两个参数的权限,我正好有机器的root权限,修改之,发现,还真可以。 但是如果没有root权限怎么解决,能不能通过修改程序获得就不知道了。希望高人看到后指点一下! 修改/etc/sysctl.conf的文件,加入TCP连接中TIME-WAIT sockets快速回收: #开启TCP连接中TIME-WAIT sockets的快速回收 net.ipv4.tcp_timestamps=1 net.ipv4.tcp_tw_recycle=1 只是修改sysctl文件不会马上生效,如果想使修改马上生效可以执行下面的命令: #立即对刚修改/etc/sysctl.conf的文件生效 sysctl -p 备注: sysctl 只是临时的修改配置信息,可以直接修改 /etc/sysctl.conf 文件进行永久修改 sysctl 命令使用:http://blog.chinaunix.net/uid-20622737-id-3759357.html 实践来自:http://blog.chinaunix.net/uid-20622737-id-3759352.html Generated by Jackxiang's Bo-blog 2.1.1 Release