一、故障现象

我们团队访问腾讯云上部署的测试环境中的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. display:inline与display:block——行内元素显示与块级元素显示

    display:inline 的作用是设置对象做为行内元素显示,inline是内联对象的默认值(ps:内联对象就是不自动产生换行的元素,比如span) 而我们一般用的div是块级元素,默认displa ...

  2. 针对Oracle表 列字段的增加、删除、修改以及重命名操作sql

    增加字段语法:alter table tablename add (column datatype [default value][null/not null],….); 说明:alter table ...

  3. Android平台利用OpenCL框架实现并行开发初试

    http://www.cnblogs.com/lifan3a/articles/4607659.html 在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心.高 ...

  4. Django学习笔记之Django视图View

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  5. Zabbix 自定义Key

    系统:Linux Centos 7.4 x64.Windos 2008 x64 服务:Zabbix 3.0.16 说明1:自定义Key 主要通过自定义 脚本 或者 命令 来实现自定义监控类型,需要在a ...

  6. c刷新缓冲区

    int c; while((c = getchar()) != '\n' && c != EOF);

  7. 使用IDEA整合SSM框架

    一.安装环境和开发工具 在整合Spring,SpringMVC 和 MyBatis 的过程中,很容易遇到一些小问题,因此记录下整合过程. 首先是安装环境和开发工具,如下: Window 7 Jdk 1 ...

  8. Spring Boot JDBC 连接数据库

    文本将对在Spring Boot构建的Web应用中,基于MYSQL数据库的几种数据库连接方式进行介绍. 包括JDBC.JPA.MyBatis.多数据源和事务. JDBC 连接数据库 1.属性配置文件( ...

  9. Linux系统下wget命令的使用教程

    一.Linux wget简介 wget是linux上的命令行的下载工具.这是一个GPL许可证下的自由软件.Linux wget支持HTTP和FTP协议,支持代理服务器和断点续传功能,能够自动递归远程主 ...

  10. JAVA基础补漏--多态

    Fu obj = new ZI(); 访问成员变量规则 编译看左,运行看左. obj.num; 1.直接通过对象名访问成员变量:看等号左右是谁,优先用谁,没有则往上找. obj.getnum(); 2 ...