记一次诡异的网络故障排除 - 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:是 ...
随机推荐
- CodeForces - 86D Powerful array (莫队)
题意:查询的是区间内每个数出现次数的平方×该数值的和. 分析:虽然是道莫队裸体,但是姿势不对就会超时.答案可能爆int,所以要开long long 存答案.一开始的维护操作,我先在res里减掉了a[p ...
- for 循环与嵌套
循环:反复执行某段代码.循环四要素:初始条件,循环条件,循环体,状态改变 for(初始条件;循环条件;状态改变){ 循环体} 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如果 ...
- CF335B
/*CF335B 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 否则执行 ...
- 20145219 《Java程序设计》第01周学习总结
20145219 <Java程序设计>第01周学习总结 教材学习内容总结 软件分类:系统软件(DOS.Windows.Linux等).应用软件(扫雷.QQ等) 人机交互方式:图形化界面.命 ...
- zabbix通过snmp监控网络设备
首先需要在zabbix的server端或proxy端安装snmpd服务 安装: yum -y install net-snmp* 查看版本: [root@Check3 ~]# snmpd -v NET ...
- 【P2944】地震损失(最大流,洛谷)
绝对难度虚高的一题 看到题目,至少损坏几个房子,开始考虑最小割,建的是双向边,所以拆点,边权除了自己与自己的之外都连inf.然后把所有求救的点都连到超级源上,跑一遍最大流就可以了. #include& ...
- JDBCTemplate执行增删改查(CDUR)操作
1.JdbcTemplate简介 (1)Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtil. JdbcTemplate可以直接操作数据库, ...
- mysql CMD命令窗连接 - 转载
cmd连接mysql的方法详解 首先需要进入mysql的安装文件夹bin目录下:cd + C:\Program Files\MySQL\MySQL Server 5.5\bin 连接:mysql -h ...
- Elasticsearch 配置优化
cluster.routing.allocation.same_shard.host:true 这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了). ...
- oracle 结构化语言查询 DML DDL DCL
--结构化查询语言 (Structured Query Language),具有定义. --查询.更新和控制等多种功能,是关系数据库的标准语言. --SQL分类: -- 数据操纵语言DML Data ...