解决 Cannot assign requested address 问题
原因:
这种情况一般发生在高并发服务器上或者压测时会出现。
每个socket链接会占用本地一个端口,短链接使用毕后会立刻关闭,这时链接处于TIME_WAIT状态,本地的端口仍然被占用着。本地端口最多为6W个,如果在短时间内建立的大量的TCP短链接,本地端口会被TIME_WAIT迅速耗光,导致Cannot assign requested address
解决方法:开启端口快速回收
切换到root用户
1、vim /etc/sysctl.conf
2、添加或者修改
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
3、保存
4、运行 sysctl -p
https://blog.csdn.net/weixin_30507481/article/details/97637914
connect 失败
-
TCP 客户端程序发起大量 TCP 连接,但是当超过一定数量后,connect 失败,使用 strace 跟踪程序系统调用,发现如下信息
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 28232 connect(28232, {sa_family=AF_INET, sin_port=htons(26800), sin_addr=inet_addr("192.168.154.201")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address)
-
可以看出 connect 时,发生了 EADDRNOTAVAIL 错误
原因
-
经过分析,发生该错误的原因是该机器上的系统本地可用端口范围值(ip_local_port_range)限制了连接的数量,查看该值如下
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
-
The /proc/sys/net/ipv4/ip_local_port_range defines the local port range that is used by TCP and UDP traffic to choose the local port. You will see in the parameters of this file two numbers: The first number is the first local port allowed for TCP and UDP traffic on the server, the second is the last local port number. For high-usage systems you may change its default parameters to 32768-61000 -first-last.
-
可以计数得出,该配置下本地端口最多支持 28232 多个连接,当连接数已到达这个值,再 connect 的话就会发生 EADDRNOTAVAIL
解决方法
-
修改 ip_local_port_range 值, 在 /etc/sysctl.conf 中加入如下行
net.ipv4.ip_local_port_range = 1024 65535
-
然后执行如下命令使修改生效
[root@localhost ~]# sysctl -p
onnct端:
[root@~]# netstat -apn |grep 27017 |wc -l
28987
[root@~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
server端:
[root@~]# netstat -apn |grep 27017 |wc -l
28989
kill掉 mongodb重启后,已启动立马是这样:
[root@host]# netstat -apn |grep 27017 |wc -l
741
[root@host]# netstat -apn |grep 27017 |wc -l
14480
[root@host]# netstat -apn |grep 27017 |wc -l
18358
[root@host]# netstat -apn |grep 27017 |wc -l
18769
[root@host]# netstat -apn |grep 27017 |wc -l
21736
[root@host]# netstat -apn |grep 27017 |wc -l
28232
[root@host]# netstat -apn |grep 27017 |wc -l
28232
[root@host]# netstat -apn |grep 27017 |wc -l
28232
[root@host]# netstat -apn |grep 27017 |wc -l
28232