框架与语言:php tp6+swoole
原因:每隔几天就会出现,redis:Cannot assign requested address
开始想法,谷歌、百度。然后结果都是配置系统参数。比如下面例子
vi /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 6024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 32768 65000
net.ipv4.tcp_max_tw_buckets = 11000
net.ipv4.tcp_timestamps=0
保存后 sysctl -p
其实这种方式是对的,但是,我要说但是了。我一开始也是像上面配置系统参数,结果不行的。
然后去查看网络状态,开始time_wait是超高,close_wait也是超高,这种明显就是端口使用了没释放。然后去查看代码。发现redis链接配置没有配置超时断开链接。swoole的链接池是短链接,所以不是长链接的原因。
打开 tp6的cache.php 、queue.php redis 配置选项,填写上timeout参数 设置为10;配置重启服务后time_wait明显的上升速度变慢了,但是还是在上升。
最后看redis服务器的配置,我也无语了...
redis的timeout 参数也是为0。这个参数是不能为0的,不然不活跃链接是不会断开的。最后timeout 设置成60。time_wait 保持很好!
查询端口链接数量
netstat -ano |grep 6379 |wc -l
查询结果
查询网络状态数量
-
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
查询结果
close_wait
正式服务程序都是部署在docker容器的,文件、系统、系统内核参数都是一样的,但是,容器里面的close_wait一直居高不下,我也没找到原因,不在容器里面close_wait就是正常的,有大佬知道原因吗。最后一行命令解决。
netstat -nap |grep :8009|grep CLOSE_WAIT | awk '{print $7}'|awk -F"\/" '{print $1}' |awk '!a[$1]++' |xargs kill