一、故障现象

我们团队访问腾讯云上部署的测试环境中的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参数引起的网络故障的更多相关文章

  1. 网络设备配置与管理(华为)基础系列 :VLAN故障排除和GVRP

    一.VLAN故障排除 故障排除的三步骤:故障定位 → 分析故障 → 排除故障 一般情况下,网络设备配置的故障有两种排错方式 A.静态排错:主要靠display查看配置信息的方式进行 在相关vlan下d ...

  2. IEEP部署企业级网络工程-OSPF邻居关系故障排除

    OSPF邻居关系故障-现象与排除 一.OSPF邻居关系故障-现象与排除 1.OSPF建立邻居关系时,将检验hello报文中的Area ID .Autype.Authentication.network ...

  3. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  4. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

  5. 第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  6. 利用Ring Buffer在SQL Server 2008中进行连接故障排除

    原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...

  7. Linux系统之TroubleShooting(故障排除)(转)

    尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...

  8. Linux系统之TroubleShooting(启动故障排除)

    尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...

  9. DNS服务器的维护与故障排除

    1. DNS故障诊断的常用工具或命令 诊断DNS解析故障的四个常用命令工具: ①unbound-checkconf:用于检查unbound服务器配置文件的语法错误 ②unbound-control:是 ...

随机推荐

  1. D3学习之地图

    D3学习之地图 (2017.03.09-03.11) 地图的意义 在可视化领域中,将数据点投影和关联到地理区域上,是一个非常关键的内容(体现了可视化中利用读者自身知识常识从而加速吸收信息的原则). G ...

  2. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  3. dedecms 织梦利用arcpagelist标签实现首页arclist分页

    DedeCMS首页arclist分页可以利用arcpagelist标签来实现,这里说一下调用方法:首先必须在首页的<head></head>标签里面引入如下js代码: < ...

  4. [WPF+Prism]WPF个人集成平台

    前段时间学习了一下Prism,感觉应该找个机会实践一下,而且前段时间,贱内(希望我老婆看不到这篇文章:))让我帮她做个定时提醒的小工具,做好之后感觉以前做了好多自己能用的小工具,如果能够整合到一起,该 ...

  5. 探秘DPDK Virtio的不同路径

    什么是Vhost/Virtio Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主 ...

  6. 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 ...

  7. spring mvc: 密码框

    以user为例,包含username, password字段. user.java public class User { private String username; private Strin ...

  8. 20165332 预备作业三 Linux安装及命令入门

    Linux安装及命令入门 一.安装Linux操作系统 由于做的比较晚,结合大多数同学的经验和娄老师的<基于VirtualBox虚拟机安装Ubuntu图文教程>,整个安装过程还算顺利,唯一遇 ...

  9. react-router路由

    1.http://blog.csdn.net/sunshine215/article/details/78296404(react-router v4 使用 history 控制路由跳转) 2.htt ...

  10. jQuery——操作复选框(checkbox) attr checked不起作用

    这天用到jQuery功能,想实现一个简单的复选框动态全选或全不选,结果测试发现 attr(‘checked’,'checked’);与attr(‘checked’,true); 都不好使,要么第一次成 ...