记一次诡异的网络故障排除 - 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:是 ...
随机推荐
- Why GraphQL is Taking Over APIs
A few years ago, I managed a team at DocuSign that was tasked with re-writing the main DocuSign web ...
- day1 python调用模块,密码加密
import getpass #加密密码 username = input("username:") password = getpass.getpass("passwo ...
- SSDB系列文章推荐
1. 下载和安装: http://ssdb.io/docs/zh_cn/install.html 2. SSDB 文档 http://ssdb.io/docs/zh_cn/index.html ...
- winform webbrowser禁用网页target=blank
/// <summary> /// 屏蔽target=_blank 的弹出窗口 /// </summary> /// <param name="sender&q ...
- NOIP 统计单词个数
描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单词个 ...
- [算法] 将单链表的每K个节点之间逆序
题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...
- Spring积累
<tx:annotation-driven/> (Spring的XML配置里两大Bean的声明之一) 那我们是否就可以在程序中所有被spring管理的类(@Controller.@Ser ...
- Count and Say,统计并输出,利用递归,和斐波那契数列原理一样。
问题描述:n=1,返回“1”:n=2,返回“11”:n=3,返回“21”:n=4,返回1211,.... 算法分析:和斐波那契数列道理差不多,都是后一个要依赖前一个元素.因此可以使用递归,也可以使用迭 ...
- 记一次Configured Capacity: 0 (0 B)的解决
场景 最近hadoop集群新加了一个节点N,通过Ambari管理 一切正常. 过了两天发现,虽然集群每天要进几个G的数据(共8个节点),但节点N占用空间丝毫没有变化,显然没有进数据啊 日志 查看该节点 ...
- java XML解析
package com.kpsh.myself; import java.io.File;import java.io.FileInputStream;import java.util.List; i ...