问题背景:
某服务突然无法调用注册在轻量配置中心的服务提供者,但登录轻量配置中心控制台是可以搜索到对应的服务,且服务提供者的 IP、端口均正确。
查看轻量配置中心日志
查看config-center.log:
2018-10-09 10:01:33.479 [com.taobao.remoting.TimerThread] [ERROR] [com.alibaba.configcenter.registry.service.push.PushExecuteTask] - [push-error] 30005ms, reason=响应超时[30005]ms., GroupId[com.xxx.busi.shop.service.BusiShopService:1.0.0, sunlinqiang, non-persist], Revision=1, DataSize=0, Connection=ip:port
配置中心日志显示响应超时
查看客户端日志
1. /home/admin/logs/diamond-client/diamond-client.log
01 2018-10-09 16:26:01.028 ERROR [com.taobao.diamond.client.Worker.longPullingdefault:c.t.d.c.i.DiamondEnv] [] [] [500] longPulling error
01 2018-10-09 16:26:01.293 ERROR [com.taobao.diamond.client.Worker.longPullingdefault:c.t.d.c.i.DiamondEnv] [] [] [500] longPulling error
客户端显示拉取失败
2. /home/admin/taobao-tomcat-production-xxxx/logs/catalina.out
日志不输出
3 /home/admin/logs/hsf/hsf.log
01 2018-10-09 10:24:44.083 ERROR [HSF-Framework-AddressRefresh-4-thread-1:t.hsf] [99b83a99-9061-44a5-97ed-f1c92c8e0be9] [] [HSF-0066] consumer service [com.xxx.xx.atomic.xxerinfo.service.xxxrderInfoService:1.0.0] received empty address list! pls. double check if its associated implementation [MTConfigServerRegistry] exist or not
hsf服务获取不到地址列表,也就是与轻量配置中心的交互有问题
确定地址服务器 IP 跟轻量配置中心 IP 一致
ping jmenv.tbsite.net
没有问题
查看网络连接各状态连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
发现有大量的time_wait
修改参数
vim /etc/sysctl.conf
添加
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
修改参数含义(参数更改from https://www.cnblogs.com/softidea/p/6062147.html):
net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout修改系統默认的TIMEOUT时间
使配置生效
/sbin/sysctl -p
更改后再次查看
time_wait减少后,服务调用正常了
这种方法只是暂时解决表面time_wait问题,但是出现time_wait的原因还需要结合代码排查