问题描述
某日,正在欢快的写bug时,微信群客户反馈某个页面无法正常显示,并附带截图。
解决过程
立马远程,F12查看console,具体情况如下
红红的一片,煞是好看。 废话不多说,立即连上服务器。
先说下网络架构
域名 ==》 nginx ==> 2台应用服务器,其中nginx 和 应用1共用一台服务器。
连上应用服务器后,查看进程(ps aux|grep java、ps aux|grep nginx)、CPU(top)、内存(free -m)、应用日志、一切正常。
初步怀疑是客户的网络有问题,为了验证猜想,联系客户,在出问题的电脑上装上 Wireshark 进行网络抓包,并设置过滤规则为指定 IP
经过一段时间等待,ERR_CONNECTION_TIME_OUT 再次出现,Wireshark 如下:
浏览器network如下
可以看到请求在握手阶段就失败了。
为确认访客网络是否异常,使用cmd,ping -t baidu.com 挂了半小时,期间应用的其他请求有出现
ERR_CONNECTION_TIME_OUT,但是 ping baidu.com 没有出现波动。。。所以暂时排除客户网络异常。。。。。
继续查看服务器
输入 netstat -s | grep -i "listen",出现 syns to listen sockets dropped,但是并没有times the listen queue of a socket overflowed
继续输入
netstat -s |grep "SYNs to LISTEN sockets dropped"
netstat -s |grep "passive connections rejected because of time stamp"
发现值一样
感觉sync to listen sockets drop的原因有可能与时间戳有关
查询相关资料,因为2.6内核以上中tcp_timestamps默认是打开的,所以当打开 tcp_tw_recycle时会导致部分通过NAT上网client无法正确连接服务器,故障表现为client发出SYN后无法收到server返回 的SYN+ACK
解决办法
vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle=0
/sbin/sysctl -p 生效
后观察一周未出现 ERR_CONNECTION_TIME_OUT