记一次诡异的网络故障排除 - tpc_tw_recycle参数引起的网络故障
一、故障现象
我们团队访问腾讯云上部署的测试环境中的Web系统A时,偶尔会出现类似于网络闪断的情况,浏览器卡很久没有反应,最终报Connection Timeout。
不过奇怪的是,当团队中的某个人无法访问A时,其他人仍然可以正常访问。而且无法访问的这个人如果利用VPN,找一台其他地方的主机为跳板,也可正常访问A。
而且该故障发生几率较低,持续时间也较短,一般稍等片刻即可自行恢复。所以,很长一段时间以来,该故障均没有引起重视,只是被我们简单的认为可能是运营商网络质量问题。
直到最近发生几率越来越高,我们终于下决心要找出根因。
二、排查思路与步骤
1、既然故障发生时,仍然有人可以正常访问系统A,首先暂时排除系统A的问题。
2、系统A在同一时间,针对不同的客户端提供了差异化的服务。第一反应是不是因为某个客户访问太频繁,触发了网络上某些中间节点的流控机制,从而导致该客户端去往A的流量被暂时截断。
为了验证这一问题,我们在系统A所在服务器上使用TCP Dump抓包,待故障重现时,查看客户端的数据包是否有发送到A所在服务器。如果没有,则说明故障是由于网络中间设备丢包所致;如果有,则说明是A所在服务器操作系统丢包所致。
抓包命令如下:
sudo tcpdump -i eth0 tcp port
其中eth0是服务器外网网卡设备描述符,6001是系统A监听端口。
抓包结果如下所示:
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
IP 125.69.28.252.64793 > agent-1.6001: Flags [S], seq 4247449309, win 65535, options [mss 1416,nop,wscale 5,nop,nop,TS val 703318263 ecr 0,sackOK,eol], length 0
当故障发生时,A所在服务器不断收到到客户端发生来的SYN包,但是却一直没有回应SYN+ACK,服务器不断接受到客户端重发的SYN包,但是始终无法完成TCP三次握手成功建立连接。一段时间后,客户端报Connection Timeout。
3、到此,基本可以确认不是网络运营商的问题,而是因为数据包到达A所在服务器后,因为某种原因被内核丢包了。
为什么内核会丢包了呢?搞不懂那就搜索一下吧。搜索关键字“TCP SYN包 不回复”,果然搜索结果首页中就有类似问题。
比如这篇 https://blog.csdn.net/jueshengtianya/article/details/52130667
基本都说是Linux开启了TCP快速回收功能所致。
4、将之前操作系统设置的内核参数tcp_tw_recycle=1注释并让其生效后,反复测试,故障不再重现。
三、故障原因
TCP快速回收功能开启后,操作系统会记录客户端IP发出的数据包的时间戳,如果收到的数据包的时间戳早于最近一次记录的时间戳,操作系统将认为该数据包是过期的数据包,故会丢弃此包。
当某个客户端IP的数据包是由同一主机产生时,数据包的时间戳通常都是单调递增的,故一般不会出问题。但是在NAT网络环境下,同一个客户端IP背后转发的是诸多内网主机产生的数据包,不同主机产生数据包的时间戳就不一定保证单调递增了,所以会随机出现丢包故障。
四、结论
1、在当今NAT网络环境随处可见的大背景下,Linux服务器不要开启TCP快速回收功能,即不应该设置内核参数tcp_tw_recycle=1。
2、遭遇随机小概率发生的网络故障时,要及早引起重视,排查出根因。网络故障的排查宜分段排除,当应用层的错误提示信息量不足时,抓包是最直接快速的检查手段。
记一次诡异的网络故障排除 - tpc_tw_recycle参数引起的网络故障的更多相关文章
- 网络设备配置与管理(华为)基础系列 :VLAN故障排除和GVRP
一.VLAN故障排除 故障排除的三步骤:故障定位 → 分析故障 → 排除故障 一般情况下,网络设备配置的故障有两种排错方式 A.静态排错:主要靠display查看配置信息的方式进行 在相关vlan下d ...
- IEEP部署企业级网络工程-OSPF邻居关系故障排除
OSPF邻居关系故障-现象与排除 一.OSPF邻居关系故障-现象与排除 1.OSPF建立邻居关系时,将检验hello报文中的Area ID .Autype.Authentication.network ...
- 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除
目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...
- 第十篇 Replication:故障排除
本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...
- 利用Ring Buffer在SQL Server 2008中进行连接故障排除
原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...
- Linux系统之TroubleShooting(故障排除)(转)
尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...
- Linux系统之TroubleShooting(启动故障排除)
尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...
- DNS服务器的维护与故障排除
1. DNS故障诊断的常用工具或命令 诊断DNS解析故障的四个常用命令工具: ①unbound-checkconf:用于检查unbound服务器配置文件的语法错误 ②unbound-control:是 ...
随机推荐
- D3学习之地图
D3学习之地图 (2017.03.09-03.11) 地图的意义 在可视化领域中,将数据点投影和关联到地理区域上,是一个非常关键的内容(体现了可视化中利用读者自身知识常识从而加速吸收信息的原则). G ...
- React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发 2016/09/23 | React Native技术文章 | Sky丶清| 4 条评论 | 1 ...
- dedecms 织梦利用arcpagelist标签实现首页arclist分页
DedeCMS首页arclist分页可以利用arcpagelist标签来实现,这里说一下调用方法:首先必须在首页的<head></head>标签里面引入如下js代码: < ...
- [WPF+Prism]WPF个人集成平台
前段时间学习了一下Prism,感觉应该找个机会实践一下,而且前段时间,贱内(希望我老婆看不到这篇文章:))让我帮她做个定时提醒的小工具,做好之后感觉以前做了好多自己能用的小工具,如果能够整合到一起,该 ...
- 探秘DPDK Virtio的不同路径
什么是Vhost/Virtio Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主 ...
- LeetCode第[16]题(Java):3Sum Closest (和目标值最接近的三个数的和)——Medium
题目难度:Medium 题目: Given an array S of n integers, find three integers in S such that the sum is closes ...
- spring mvc: 密码框
以user为例,包含username, password字段. user.java public class User { private String username; private Strin ...
- 20165332 预备作业三 Linux安装及命令入门
Linux安装及命令入门 一.安装Linux操作系统 由于做的比较晚,结合大多数同学的经验和娄老师的<基于VirtualBox虚拟机安装Ubuntu图文教程>,整个安装过程还算顺利,唯一遇 ...
- react-router路由
1.http://blog.csdn.net/sunshine215/article/details/78296404(react-router v4 使用 history 控制路由跳转) 2.htt ...
- jQuery——操作复选框(checkbox) attr checked不起作用
这天用到jQuery功能,想实现一个简单的复选框动态全选或全不选,结果测试发现 attr(‘checked’,'checked’);与attr(‘checked’,true); 都不好使,要么第一次成 ...