代码改变世界

Cannot assign requested address

  youxin  阅读(11744)  评论(0编辑  收藏  举报

解决 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

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2016-03-28 j2ee ehcache
2016-03-28 j2ee servlet listener
2016-03-28 j2ee Servlet、Filter、Listener
2016-03-28 java Servlet中的过滤器Filter
点击右上角即可分享
微信分享提示