环境信息:CenterOS,服务器配置2C4G
问题描述:在压测时,发现错误率很高,查看报错日志提示: Cannot assign requested address【程序对外建立新连接,结果本地端口全部用完导致的异常】
问题分析:由于客户端频繁的连服务器,虽然socket正常关闭,但端口未立即释放,而是会等待60s后释放,导致很多的TIME_WAIT(通过netstat查看),以至于用光了客户端可用的端口号,导致建立新连接时无可用端口,即“Cannot assign requested address”,是客户端的问题不是服务器端的问题。
解决方案:
1、内核参数优化,修改客户端系统内核参数:(需要root权限)
打开配置文件vim /etc/sysctl.conf:在/etc/sysctl.conf文件中加入下列4行参数
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
备注:
net.ipv4.ip_local_port_range = 1024 65535 #设置本地端口范围从1024~65535,共6W+个端口;
net.ipv4.tcp_max_tw_buckets = 5000 #所允许time_wait的最大数,超过则立刻被清除且警告;
net.ipv4.tcp_tw_reuse = 1 #开启tcp_tw重用,允许将TIME-WAIT sockets重新用于新的TCP连接(默认为0,表示关闭);
net.ipv4.tcp_tw_recycle = 1 #开启tcp_tw快速回收,TCP连接中TIME-WAIT sockets的快速回收(默认为0,表示关闭);
2、运行sysctl -p,让内核参数立即生效
————————————————
版权声明:本文为CSDN博主「福多多的福」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Moonlight_16/article/details/121953688